我在我的代码中这样做,
HOST = '192.168.1.3' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) query_details = {"page" : page, "query" : query, "type" : type} s.send(str(query_details)) #data = eval(pickle.loads(s.recv(4096))) data = s.recv(16384)
但我总是在最后一行得到EOF。我发送的代码,
self.request.send(pickle.dumps(results))
s.send 是 不 保证发送你给它的每一个字节;使用 s.sendall 相反。
s.send
s.sendall
同样地, s.recv 是 不 保证接收你所请求的每一个字节——在这种情况下,你需要通过其他方式确切地知道你需要接收多少字节(例如,首先发送你发送的字符串的长度,用 struct 模块),并且你有责任将自己循环到这个目的。没有也不可能有 recvall 因为流套接字是 不 以任何方式“自定界”——它们只是流,被分解成完全任意大小的、与语义无关的数据包。
s.recv
struct
recvall
你不应该得到 EOF 从 recv 当然,你也可以期待自己的评论,从 pickle.loads (因为它的论点可能只是 部分 对方发送的字节数:如前一段所述)。
EOF
recv
pickle.loads