我有一个简单的Java Socket
连接到我的Python socketserver
。
在客户端中,我想发送一些输入中给出的大小的数据:我想首先发送一个Integer
的数据大小,然后发送byte
数据的大小。
这是客户:
Integer size = 1234
Socket so = new Socket("10.151.0.248", 8000);
byte[] bytes = new byte[size];
DataOutputStream out = new DataOutputStream(so.getOutputStream());
out.writeInt(size);
out.write(bytes);
从服务器端,我想读取先到达的数据量,然后再次读取流,直到收到所有内容;作为最后一步,我将向客户发送一封ACK。
这是服务器:
def handle(self):
tot_data = []
length = self.request.recv(4)
size = struct.unpack("!i", length)[0]
while len(tot_data) < size:
data = self.request.recv(size - len(tot_data))
if not data: break
tot_data.append(data)
data = bytes(b"ACK")
# just send back the ack when transfer completed
self.request.sendall(data)
我能够检索服务器中数据的大小,但是当我尝试从流中读取实际数据时,只会再次检索4个字节,然后recv()
仍然被阻塞等待更多数据。我想首先检索所有数据,然后在传输完成后发回ACK。
有什么建议吗?
答案 0 :(得分:3)
handle
方法Python方面存在一个问题。 self.request.recv
返回一个字符串(对于Python 2.x,它将是Python3的字节),并在数组中汇编字符串。所以数组的长度只是块的数量而不是接收的字节数。
你应该写:
def handle(self):
tot_data = b""
length = self.request.recv(4)
size = struct.unpack("!i", length)[0]
while len(tot_data) < size:
data = self.request.recv(size - len(tot_data))
if not data: break
tot_data += data
data = bytes(b"ACK")
# just send back the ack when transfer completed
self.request.sendall(data)