• python-socket 粘包问题


    解决粘包的问题:
    1.服务端在发送数据之前,先把发送数据的长度告诉客户端,要发送多少数据,然后客户端根据这个数据的长度循环接收就OK
    传输过程:
    服务端:
        1.send  #数据长度
        4.recv  #收到确认信息,开始下一步发送
        send  #发送数据
        
    客户端 :
        2.recv #获取数据长度
        3.send #发送确认信息
        recv #循环接收
     
    socket-server端代码:
                #解决粘包问题
                send_data = bytes(send_data,encoding='utf-8')  #编码成utf-8,字节,并把str转换为字节
                ready_tag = 'Ready|%s' %len(send_data)
                conn.send(bytes(ready_tag,encoding='utf-8'))
                feedback = conn.recv(1024)  #收到客户端发送过来的Start
                feedback = str(feedback,encoding='utf-8')  #把收到的feedback 转换为str
                if feedback.startswith('Start'):
                    conn.send(send_data)

    socket-client端代码:

    #解决粘包的问题
        ready_tag = s.recv(1024) # Ready|9999
        ready_tag = str(ready_tag,encoding='utf-8')
        if ready_tag.startswith('Ready'):  # Ready|9999
            msg_size = int(ready_tag.split('|')[-1])
        start_tag = 'Start'
        s.send(bytes(start_tag,encoding='utf-8')) #给server发送Start,告诉server可以准备发送数据了
        recv_size = 0  #初始化数据大小
        recv_msg =b''
    
        while recv_size < msg_size:
            recv_data = s.recv(1024)
            recv_msg += recv_data
            recv_size += len(recv_data)
            print('MSG SIZE %s RECE SIZE %s' % (msg_size, recv_size))
    
        print(str(recv_msg,encoding='utf-8'))
  • 相关阅读:
    Oracle Database 11g : SQL 基础
    Idea-Java接入银联支付的Demo
    Linux文件系统挂载管理
    Linux文件系统
    使用fdisk进行磁盘管理
    Vim文本编辑器
    Linux系统常用命令
    Linux系统目录架构
    Linux文件基本操作管理
    Linux文件系统的基本结构
  • 原文地址:https://www.cnblogs.com/pangguoping/p/5675390.html
Copyright © 2020-2023  润新知