Java 和 Python 之间的套接字连接

Socket connection between Java and Python

我有一个简单的JavaSocket connected to my 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。

有什么建议吗?

handle 方法 Python 方面有一个问题。 self.request.recv returns 一个字符串(对于 Python 2.x,它将是 Python3 的字节),而你 assemble 数组中的字符串。所以数组的长度只是块的数量而不是接收到的字节数。

你应该写:

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)