使用Python的recv时出现EOF错误
我在我的代码里这样做,
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 个回答
8
s.send
并不能保证把你给它的每一个字节都发送出去;建议使用 s.sendall
。
同样,s.recv
也不能保证能接收到你请求的每一个字节——在这种情况下,你需要通过其他方式准确知道你需要接收多少字节(比如,先发送你要发送的字符串的长度,用 struct
模块编码),而且你需要自己负责循环接收这些字节。没有 recvall
这个方法,因为流套接字并不是“自我分隔”的——它们只是流,被分成完全任意大小的包,这些大小没有任何语义上的意义。
你在 recv
中不应该遇到 EOF
,当然你可以期待在你注释掉的那一行中看到它,来自 pickle.loads
(因为它的参数可能只是对方发送的字节的一部分:正如前面一段所解释的)。