zoukankan      html  css  js  c++  java
  • 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'))
  • 相关阅读:
    Android应用开发之避免内存泄露
    史上最经典的数据库面试题之二
    某大型银行深化系统之二十一:Log4j执行性能
    ruby支持批量数组的定义
    为VIM提供python代码提示功能
    使用win7登陆远程机器时自动保存密码
    安装Beanstalk
    在linux下安装或者卸载nginx
    python的数据类型
    使Ruby自动定位查找本地路径
  • 原文地址:https://www.cnblogs.com/pangguoping/p/5675390.html
Copyright © 2011-2022 走看看