问题是,您尝试一次发送太多字节, \\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: <
...