解决黏包问题:
在传输大量数据之前,先告诉接收端要发送数据大小
如果想更漂亮的解决问题,可以通过struct模块来定制协议
为什么会出现黏包现象:
首先只有在tcp协议中才会出现黏包现象
是因为tcp协议是面向流的协议
在发送的数据传输的过程中还有缓存机制来避免数据丢失
因此 在连续发送小数据的时候,以及接受大小不符的时候都容易出现黏包现象
本质还是因为我们在接受数据的时候不知道发送的数据长短
struck模块
pack unpack
模式:i
pack之后的长度:4个字节
unpack之后拿到的数据是一个元祖:元祖的第一个元素才是pack的值
#server
import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self): #self.request 就相当于conn
while True:
msg = self.request.recv(1024).decode('utf-8')
if msg == 'q':
# self.request.close()
break
print(msg)
info = input('>>>>')
self.request.send(info.encode('utf-8'))
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)
#thread线程
server.serve_forever()
#client
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
msg = input('>>>>')
if msg == 'q':
break
sk.send(('大众点评 :'+msg).encode('utf-8'))
ret = sk.recv(1024).decode('utf-8')
print(ret)
sk.close()