python socket 收发消息处理粘包问题

import socket
import struct

    # 初始化socket对象
    def initialSocket(self):
        self.WrtLog('开始连接服务端...')
        try:
            self.tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.tcp_client_socket.connect((host, port))  # 连接
            self.WrtLog('连接成功.')
        except Exception as ex1:
            self.WrtLog('连接失败:'+str(ex1))


    # 监听服务端发送过来的消息
    def fnConnectServer(self):
        self.initialSocket()
        while True:
            msg = self.fnSockGetMsg(self.tcp_client_socket)
            self.WrtLog('服务端发来消息:'+msg)

    # 停止
    def fnStopServer(self):
        self.WrtLog('关闭连接...')
        msg = 'qt_quit'
        try:
            self.fnSockSendMsg(self.tcp_client_socket, msg)
            self.tcp_client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 释放socket对象
            self.WrtLog('释放连接完成')
        except Exception as ex1:
            self.WrtLog(str(ex1))


    # 发送消息,处理粘包
    def fnSockSendMsg(self, conn, msg):
        msg = msg.encode('utf-8')
        dataHead = struct.pack('i', len(msg))  # 把消息长度打包成固定长度的bytes
        conn.send(dataHead)  # 发送包头
        conn.send(msg)  # 发送消息

    # 获取消息,处理粘包
    def fnSockGetMsg(self, conn):
        dataHead = conn.recv(4)  # 先获取包头
        dataLen = struct.unpack('i', dataHead)[0]  # 把包头解包成int类型
        # 开始读取长度为 dataLen 的数据
        recData = b''  # 获取到的消息
        cacheLen = 1024  # 缓冲区大小
        page = dataLen // cacheLen  # 分片
        if page > 0:
            for i in range(page):
                recData += conn.recv(cacheLen)
            pageEnd = dataLen % cacheLen  # 最后一片
            recData += conn.recv(pageEnd)
        else:
            recData += conn.recv(dataLen)
        msg = recData.decode('utf-8')
        return msg



          

 

posted @ 2021-07-01 14:01  Vaynedy  阅读(131)  评论(0编辑  收藏  举报