解决黏包问题:
在传输大量数据之前,先告诉接收端要发送数据大小
如果想更漂亮的解决问题,可以通过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()

 

posted on 2019-02-11 18:00  Tim-code  阅读(116)  评论(0编辑  收藏  举报