继上次写了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()