Java和Python之间的套接字连接

时间:2015-09-22 09:12:48

标签: java python sockets socketserver

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

有什么建议吗?

1 个答案:

答案 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)