我在我的代码中这样做,
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))
答案 0 :(得分:8)
s.send
不保证发送您提供的每个字节;请改用s.sendall
。
同样地,s.recv
不保证接收您要求的每个字节 - 在这种情况下,您需要通过其他方式确切地知道您需要接收多少字节(例如,发送首先是你发送的字符串的长度,用struct
模块编码),你负责自己为此目的循环。没有也不可能有任何recvall
因为流套接字不“自我分隔” - 它们只是流,被分解为完全任意大小的数据包而不是语义相关。
你不应该从EOF
本身获得recv
,但是当然你可以从pickle.loads
({1}}(你已经注释掉的那一行)得到它。因为它的参数可能只是对方发送的字节的部分:如前一段所述。