gpt4 book ai didi

java - Java和Python之间的套接字连接

转载 作者:行者123 更新时间:2023-11-30 08:09:07 26 4
gpt4 key购买 nike

我有一个简单的 Java Socket连接到我的 Python socketserver .在客户端中,我想发送一些输入中给定大小的数据:我想先发送一个 Integer 和数据大小,然后是 byte 数据 block 。

这是客户端:

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。

有什么建议吗?

最佳答案

Python 端的handle 方法存在一个问题。 self.request.recv 返回一个字符串(对于 Python 2.x,它将是 Python3 的字节),然后您将字符串组装到一个数组中。所以数组的长度只是 block 的数量而不是接收到的字节数。

你应该写:

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)

关于java - Java和Python之间的套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32712978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com