问题是,您试图一次发送太多字节,而\0将终止整个消息,因此剩余部分从未发送。
我模拟了一个类似的客户机/服务器,下面是响应:
服务器只是一种回声类型
。。。
客户机,从您的代码中稍作更改import socket
from time import sleep
def client():
# I change second packet to 2packet for visually distinguish the packets
packet = "\0<2packet>2packet>"
HOST, PORT = '127.0.0.1', 4433
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
sock.connect((HOST, PORT))
while True:
try:
sock.send(packet)
sleep(1)
# this is the problem here
reply = sock.recv(131072)
if not reply:
break
print "recvd: ", reply
except KeyboardInterrupt:
print "bye"
break
sock.close()
return
client()
recvd: WelcomeOK... # the null byte teminate the send and skip all remaining message
recvd: OK...
recvd: OK...
recvd: OK...
...
您将看到,2packet从未被发送,因为它以空字节结尾,消息正文超过131072个字节,比第二部分消息正文长。
为了解决这个问题,您只需要在每个循环中发送一个字节,所以空字节只会终止它自己,并且您的下一个字节直到消息的结尾可以被发送:
通过发送单字节修改版本... previous code
while True:
try:
sock.send(packet)
sleep(1)
reply = sock.recv(1)
if not reply:
break
print "recvd: ", reply
except KeyboardInterrupt:
print "bye"
break
sock.close()
return
client()
recvd: W
recvd: e
recvd: l
recvd: c
recvd: o
recvd: m
recvd: e
recvd: O
recvd: K
recvd: .
recvd: .
recvd: .
recvd: <
recvd: p
recvd: a
recvd: c
recvd: k
recvd: e
recvd: t
recvd: >
recvd: <
recvd: /
recvd: p
recvd: a
recvd: c
recvd: k
recvd: e
recvd: t
recvd: >
recvd: # <== this null byte terminates single byte send
recvd: < # <== and next loop it tries to send the next byte, goal achieved
recvd: 2
recvd: p
recvd: a
recvd: c
recvd: k
recvd: e
recvd: t
recvd: >
recvd: <
...