使用Python的recv时出现EOF错误

1 投票
1 回答
10690 浏览
提问于 2025-04-15 23:31

我在我的代码里这样做,

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(因为它的参数可能只是对方发送的字节的一部分:正如前面一段所解释的)。

撰写回答