模块 socketserver
模块 socketserver,可以通过该模块实现服务器端能连接多个客户端
1 import socketserver 2 class Myserver(socketserver.BaseRequestHandler): 3 def handle(self): 4 self.data = self.request.recv(1024).strip() 5 print("{} wrote:".format(self.client_address[0])) 6 print(self.data) 7 self.request.sendall(self.data.upper()) 8 9 if __name__ == "__main__": 10 HOST, PORT = "127.0.0.1", 9999 11 12 # 设置allow_reuse_address允许服务器重用地址 13 socketserver.TCPServer.allow_reuse_address = True 14 # 创建一个server, 将服务地址绑定到127.0.0.1:9999 15 server = socketserver.TCPServer((HOST, PORT),Myserver) 16 # 让server永远运行下去,除非强制停止程序 17 server.serve_forever()
需要解释的是 if __name__ == "__main__":
这段代码的意思是,只有自己运行自己的代码A时才执行自己的代码A,当某个程序导入本代码A时,代码A不会运行自己的主函数
参考文章如下:
https://www.zhihu.com/question/49136398
使用struct解决黏包
借助struct模块,我们知道长度数字可以被转换成一个标准大小的4字节数字。因此可以利用这个特点来预先发送数据长度。
|
发送时 |
接收时 |
|
先发送struct转换好的数据长度4字节 |
先接受4个字节使用struct转换成数字来获取要接收的数据长度 |
|
再发送数据 |
再按照长度接收数据 |
用法:
struct.pack('i',9999)
将9999以‘i’模式进行转换为固定bytes长度
x=struct.unpack('i',head_len_bytes)[0]
将打包的数据恢复成原理的模样
模式如下:

模块hmac
hmac_obj = hmac.new(secret_key,send_str)
secret 为密钥
send_str为加密的内容
ret = hmac_obj.digest() #以二进制显示哈希
浙公网安备 33010602011771号