python网络编程3-socketserver模块
生活随笔
收集整理的这篇文章主要介绍了
python网络编程3-socketserver模块
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
一、复习
# 解决黏包问题 #为什么会出现黏包问题# 首先只有在TCP协议中才会出现黏包现象# 是因为TCP协议是面向流的协议# 在发送的数据传输过程中有缓存机制来避免数据丢失# 因此在连续发送小数据的时候,以及接收大小不符的时候都容易出现尿包现象# 本质还是因为我们在接收数据时不清楚发送数据的长短 # 解决黏包问题# 在传输大量数据之前先告诉接收端要发送的数据大小# 或者通过struct模块来定制协议 # struct模块#pack unpack# 模式‘i’# pack后的长度:4个字节# unpack后的数据是元组:元组的第一个元素才是pack的值二、hmac加密问题
import hmac h=hmac.new() # secrect_key,你想进行加密的bytes h.digest() #密文的内容 hmac.compare_digest() #对比 密文 另外一个密文例 验证客户端的合法性
server:
import socket import os import hmac # os.urandom(32) # 随机生成32位字节 def check_conn(conn):msg=os.urandom(32) # 随机一段内容conn.send(msg)h=hmac.new(secrect_key,msg)digest=h.digest()client_digest=conn.recv(1024)return hmac.compare_digest(digest,client_digest)secrect_key=b'egg' sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen()conn,addr=sk.accept() res=check_conn(conn) if res:print('合法客户端')conn.close() else:print('不合法客户端')conn.close() sk.close()client:
import socket import hmacsecret_key=b'egg' sk=socket.socket() sk.connect(('127.0.0.1',8080)) msg=sk.recv(1024) h=hmac.new(secret_key,msg) digest=h.digest() sk.send(digest)三、socketserver模块
server:
# socket tcp服务 同一时间只能和同一个客户通信 # socketserver tcp服务 同一时间和多个客户通信import socketserverclass MyServer(socketserver.BaseRequestHandler):def handle(self): #self.request 就相当于connwhile True:msg=self.request.recv(1024).decode('utf-8')if msg=='q':breakprint(msg)info=input('%s>>>'%msg[:2])self.request.send(info.encode('utf-8'))if __name__ =='__main__':server=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)# thread 线程 一个程序只有一个线程 一个线程就是调度cpu的最小单位# 只有用线程才能占用cpuserver.serve_forever()# bind、listen # conn,addr=accept # self.request=conn # socket_server #看源码方法: # 第一 多个类之间的继承关系要先整理 # 每一个类中的方法,要大致列出来 # 所有的self对象调用要清楚的了解 到底是谁的对象 # 所有的方法调用要退回到最子类的类中开始寻找,逐级查看client1:
import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while True:msg=input('>>>')if msg=='q':sk.send(b'q')breaksk.send(('大众点评:'+msg).encode('utf-8'))ret=sk.recv(1024).decode('utf-8')print(ret) sk.close()client2:
import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while True:msg=input('>>>')if msg=='q':sk.send(b'q')breaksk.send(('美团:' + msg).encode('utf-8'))ret=sk.recv(1024).decode('utf-8')print(ret) sk.close()运行结果:
参考自https://www.cnblogs.com/Eva-J/articles/8244551.html#_label5
总结
以上是生活随笔为你收集整理的python网络编程3-socketserver模块的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: notepad多行编辑_Windows
- 下一篇: python各进制的表述与转换