在python中使用recv的EOF错误

tip*_*ipu 0 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)
Run Code Online (Sandbox Code Playgroud)

但我不断在最后一行获得EOF.我发送的代码,

self.request.send(pickle.dumps(results))
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 8

s.send不是保证你每次给它字节发送; 使用s.sendall来代替.

同样,s.recv保证收到你问每一个字节-在这种情况下,你需要通过其他的方式来知道你需要接收到底有多少个字节(例如,发送首先你要发送的字符串的长度,与编码struct模块并且你负责为此目的循环.没有也不可能是recvall因为流套接字以任何方式"自我划分" - 它们只是流,被分解为完全任意的大小不具有语义相关性的数据包.

你不应该EOF从它recv自己得到一个,虽然当然你可以期望从你已注释掉的行中得到它pickle.loads(因为它的参数可能只是对应发送的字节的一部分:as在上一段解释).