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'))

 

posted @ 2016-07-16 09:40  unixfbi.com  阅读(974)  评论(0编辑  收藏  举报