一、验证客户端链接的合法性

 from socket import *
 import hmac,os

 secret_key=b'linhaifeng bang bang bang'
 def conn_auth(conn):
     '''
     认证客户端链接
     :param conn:
     :return:
     '''
     print('开始验证新链接的合法性')
     msg=os.urandom(32)
     conn.sendall(msg)
     h=hmac.new(secret_key,msg)
     digest=h.digest()
     respone=conn.recv(len(digest))
     return hmac.compare_digest(respone,digest)

 def data_handler(conn,bufsize=1024):
     if not conn_auth(conn):
         print('该链接不合法,关闭')
         conn.close()
         return
     print('链接合法,开始通信')
     while True:
         data=conn.recv(bufsize)
         if not data:break
         conn.sendall(data.upper())

 def server_handler(ip_port,bufsize,backlog=5):
     '''
     只处理链接
     :param ip_port:
     :return:
     '''
     tcp_socket_server=socket(AF_INET,SOCK_STREAM)
     tcp_socket_server.bind(ip_port)
     tcp_socket_server.listen(backlog)
     while True:
         conn,addr=tcp_socket_server.accept()
         print('新连接[%s:%s]' %(addr[0],addr[1]))
         data_handler(conn,bufsize)

 if __name__ == '__main__':
     ip_port=('127.0.0.1',9999)
     bufsize=1024
     server_handler(ip_port,bufsize)

服务端

 __author__ = 'Linhaifeng'
 from socket import *
 import hmac,os

 secret_key=b'linhaifeng bang bang bang'
 def conn_auth(conn):
     '''
     验证客户端到服务器的链接
     :param conn:
     :return:
     '''
     msg=conn.recv(32)
     h=hmac.new(secret_key,msg)
     digest=h.digest()
     conn.sendall(digest)

 def client_handler(ip_port,bufsize=1024):
     tcp_socket_client=socket(AF_INET,SOCK_STREAM)
     tcp_socket_client.connect(ip_port)

     conn_auth(tcp_socket_client)

     while True:
         data=input('>>: ').strip()
         if not data:continue
         if data == 'quit':break

         tcp_socket_client.sendall(data.encode('utf-8'))
         respone=tcp_socket_client.recv(bufsize)
         print(respone.decode('utf-8'))
     tcp_socket_client.close()

 if __name__ == '__main__':
     ip_port=('127.0.0.1',9999)
     bufsize=1024
     client_handler(ip_port,bufsize)

客户端

二、socketserver

import socketserver
class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
        self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "127.0.0.1", 9999

    # 设置allow_reuse_address允许服务器重用地址
    socketserver.TCPServer.allow_reuse_address = True
    # 创建一个server, 将服务地址绑定到127.0.0.1:9999
    server = socketserver.TCPServer((HOST, PORT),Myserver)
    # 让server永远运行下去,除非强制停止程序
    server.serve_forever()

server端

import socket

HOST, PORT = "127.0.0.1", 9999
data = "hello"

# 创建一个socket链接,SOCK_STREAM代表使用TCP协议
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    sock.connect((HOST, PORT))          # 链接到客户端
    sock.sendall(bytes(data + "\n", "utf-8")) # 向服务端发送数据
    received = str(sock.recv(1024), "utf-8")# 从服务端接收数据

print("Sent:     {}".format(data))
print("Received: {}".format(received))

client

python:验证客户端链接的合法性与socketserver的更多相关文章

  1. python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver)

     先来回顾一下昨天的内容 黏包现象粘包现象的成因 : tcp协议的特点 面向流的 为了保证可靠传输 所以有很多优化的机制 无边界 所有在连接建立的基础上传递的数据之间没有界限 收发消息很有可能不完全相 ...

  2. socketv 验证客户端链接的合法性,socketserver

    补充: send()与sendall() 在python socket编程中,有两个发送TCP的函数,send()与sendall(),区别如下: socket.send(string[, flags ...

  3. Python之socketserver模块和验证客户端链接的合法性

    验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_ke ...

  4. python网络编程之验证客户端链接的合法性

    六.socket的更多方法介绍 服务端套接字函数s.bind() 绑定(主机,端口号)到套接字s.listen() 开始TCP监听s.accept() b被动接收TCP客户的连接,(阻塞式)等待连接的 ...

  5. socketv 验证客户端链接的合法性

    一 .socketv 验证客户端链接的合法性 send()与sendall() 验证客户端 加密验证 如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用hmac+加 ...

  6. python (大文件下载及进度条展示) 验证客户端链接的合法性,socketserver

    ##########总结########### 文件校验加进度条显示 ####server import os import json import socket import struct impo ...

  7. 《Python》网络编程之验证客户端连接的合法性、socketserver模块

    一.socket的更多方法介绍 # 服务端套接字函数 s.bind() # 绑定(主机,端口号)到套接字 s.listen() # 开始TCP监听 s.accept() # 被动接受TCP客户的连接, ...

  8. python 验证客户端的合法性

    目的:对连接服务器的客户端进行判断 # Server import socket import hmac import os secret_key = bytes('tom', encoding='u ...

  9. python之路----验证客户端合法性

    验证客户端链接的合法性 import os import hmac import socket secret_key = b'egg' sk = socket.socket() sk.bind(('1 ...

随机推荐

  1. 正则提取字符串IP地址,返回IP列表

    public class Main { public static void main(String args[]) { String str = "10.11.90.1 asedfa 1. ...

  2. Vue添加新的响应式属性

    vm.userProfile = Object.assign({}, vm.userProfile, { age: , favoriteColor: 'Vue Green' })

  3. ListView与ArrayAdapter的搭配使用

    在android中,ListView是一种很重要的控件,一般的使用中,常建立一个所需类型的ArrayList,再通过ArrayAdapter把ListView绑定到ArrayList上,通过Array ...

  4. Java Swing笔记

    想到了解一下GUI主要是想用来做点小工具,记录一些笔记. 文本框自动换行和滚动条 private static JTextArea addJTextArea(JPanel panel, int x, ...

  5. 如何给MySql创建连接用户并授权

    一般在为MySql创建用户时建议使用GRANT前台命令,当然如果对我们开发者而言,方法还有很多种,比如使用INSERT命令,甚至是直接修改mysql user数据表,但仍然建议按照MySQL规范去授权 ...

  6. WPF 父子窗体联动

    问题: 近段时间,由于项目上的一些原因,设计到在WPF项目使用引用COM组件的问题,部分WPF元素浮动在COM组件之上,并且实现拖.停靠.放大等功能(子窗体不要求等比缩放,只要位置跟随主窗体即可),如 ...

  7. MySQL之基本语句

    SQL是Structure Query language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言.在众多开源数据库中,MySQL正是其中最杰出的代表,MySQL是由三个瑞典人于20世 ...

  8. js获取客户端用户IP

    <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> <script type=& ...

  9. artDialog组件应用学习(四)

    一.在对话框自定义操作按钮 预览: html调用代码: var btnArray = [ { value: '同意', callback: function () { this.content('你同 ...

  10. 深入Java字符串

    深入Java字符串     Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生.   一.从根本上认识java.lang ...