在python中使用recv的EOF错误

时间:2010-06-03 20:25:18

标签: python sockets

我在我的代码中这样做,

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))

1 个答案:

答案 0 :(得分:8)

s.send 保证发送您提供的每个字节;请改用s.sendall

同样地,s.recv 保证接收您要求的每个字节 - 在这种情况下,您需要通过其他方式确切地知道您需要接收多少字节(例如,发送首先是你发送的字符串的长度,用struct模块编码),你负责自己为此目的循环。没有也不可能有任何recvall因为流套接字“自我分隔” - 它们只是流,被分解为完全任意大小的数据包而不是语义相关。

你不应该从EOF本身获得recv,但是当然你可以从pickle.loads({1}}(你已经注释掉的那一行)得到它。因为它的参数可能只是对方发送的字节的部分:如前一段所述。