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