python TCP协议解决粘包问题

为了防止粘包问题的发生,总是在传输文件之前先计算出文件的大小,再发送文件大小,再按照文件的大小收取文件,以此来防止粘包问题的发生,基于struct可以简单实现

#server端
import json
import struct
import socketserver


class Myserver(socketserver.BaseRequestHandler):
    def my_recv(self,encoding='utf-8'):
        dic_len = self.request.recv(4)                     # 接收到长度为4的pack_dic
        dic_len = struct.unpack('i',dic_len)[0]            # unpack后得到dic的真实长度
        dic = self.request.recv(dic_len).decode(encoding)  # 以dic得真实长度来收取bytes_dic->str_dic
        dic = json.loads(dic)                              # 得到真实的dic
        return dic

    def my_send(self,dic,encoding='utf-8'):
        str_dic = json.dumps(dic)               # 将dic转换成str
        bdic = str_dic.encode(encoding)         # 将str_dic转换成bytes_dic
        dic_len = len(bdic)                     # 计算bytes_dic的长度
        bytes_len = struct.pack('i',dic_len)    # 用pack将dic长度变成4
        self.request.send(bytes_len)            # 发送长度
        self.request.send(bdic)                 # 发送dic


server = socketserver.ThreadingTCPServer(('127.0.0.1',9000),Myserver)
server.serve_forever()
#client端
import json
import struct
import socket


sk = socket.socket()
sk.connect(('127.0.0.1',9000))
print('连接成功')


def mysend(sk,dic,encoding='utf-8'):
    str_dic = json.dumps(dic)                # 先把dic转成str
    bdic = str_dic.encode(encoding)          # str转成bytes
    dic_len = len(bdic)                      # 计算bytes_dic长度
    bytes_len = struct.pack('i',dic_len)     # 用pack将dic长度变成4
    sk.send(bytes_len)                       # 发送长度
    sk.send(bdic)                            # 发送dic


def myrecv(encoding='utf-8'):
    dic_len = sk.recv(4)                     # 接收到长度为4的pack_dic
    dic_len = struct.unpack('i',dic_len)[0]  # unpack后得到dic的真实长度
    dic = sk.recv(dic_len).decode(encoding)  # 以dic得真实长度来收取bytes_dic->str_dic
    dic = json.loads(dic)                    # 得到真实的dic
    return dic

你可能感兴趣的:(python基础)