一、复习
# 解决黏包问题
#为什么会出现黏包问题# 首先只有在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