socket粘包

继上次写了socket简单server和client通信后,将程序放到了linux上试了一下。

在执行命令时,出现了粘包,即以下两条指令紧挨着执行了。 

        conn.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8')) #先发送大小给客户端
        conn.send(cmd_res.encode('utf-8'))

解决办法1 sleep(比较low),导致上一次缓冲区超时.

        conn.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8')) #先发送大小给客户端
        time.sleep(0.5) #        
        conn.send(cmd_res.encode('utf-8')

解决办法2 

        conn.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8')) #先发送大小给客户端
        client_ack = conn.recv(1024) #wait client to confirm 只要收到服务器端大小,就立刻给服务器端一个响应
        conn.send(cmd_res.encode('utf-8'))

客户端确认

# -*- coding: utf-8 -*-
__author__ = 'leeho'
import socket

client = socket.socket()

client.connect(('120.78.166.91',9999))

while True:
    cmd = input('>>:').strip()
    # 不允许指令为空
    if len(cmd)==0:continue
    # 发送指令
    client.send(cmd.encode('utf-8'))
    # 接收服务端发送的数据
    cmd_re_size = client.recv(1024)
    print('命令结果大小:',cmd_re_size)
  client.send('准备好接收了!,loser可以发'.encode('utf-8'))
received_size = 0 received_data = b'' while received_size < int(cmd_re_size.decode('utf-8')): data = client.recv(1024) received_size+=len(data) #每次收到的有可能小于1024,必须用len判断 # print(data.decode('utf-8')) received_data+=data else: print('cmd res received done ...',received_size) print(received_data.decode('utf-8'))client.close()

猜你喜欢

转载自blog.csdn.net/weixin_37224686/article/details/80959204