【问题标题】:EOF error using recv in python在python中使用recv出现EOF错误
【发布时间】:2010-06-03 20:25:18
【问题描述】:

我在我的代码中这样做,

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(str(query_details)) 调用正确吗?
  • 在什么意义上正确?语法正确

标签: python sockets


【解决方案1】:

s.send保证发送你给它的每一个字节;请改用s.sendall

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

您永远不应该从recv 本身获得EOF,尽管您当然可以期望从pickle.loads 中获得您已注释掉的行中(因为它的论点很可能是只有对方发送的字节的一部分:如上一段所述)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2014-01-16
    相关资源
    最近更新 更多