我正在Python和Java进程之间进行套接字通信。我正在尝试用java发送一个int,并用Python接收它。
Java端(发送方(:
ServerSocket ss = new ServerSocket(6666);
Socket s = ss.accept();
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
final int numberToSend = 512;
dos.writeInt(numberToSend); //In big endian
dos.flush();
Python端(接收器(:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 6666))
while True:
data_received = s.recv(4)
int_received = int.from_bytes(data_received, byteorder='big')
print("Received:", data_received, "Number:", int_received)
do_other_stuff(int_received)
我确信Java端工作正常。CCD_ 1给出4个字节。
然而,从Python的角度来看,data_received
似乎被一分为二。对于每个周期,该打印给出:
Received: b'x00' Number 0
Received: b'x00x02x00' Number 512
预期为Received: b'x00x00x02x00' Number 512
。由于消息被拆分,它会干扰do_other_stuff
。sys.getsizeof(data_received)
分别给出第一部分和第二部分的18和20。
我也尝试过int_received = struct.unpack("!i", data_received)[0]
,但它给出了struct.error: unpack requires a buffer of 4 bytes
,因为消息有1和3个字节。
我做错了什么?
我想你没有做任何逻辑错误的事情,但这似乎是TCP处理它的方式。在关于使用套接字的文档中,尽管预计会有一个数量,但接收处于等待获得预期数据量的循环中。
试着做同样的事情。伪代码中的I.E.:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 6666))
data_received = b""
long_received = 0
while True:
while long_received < 4:
data_received += s.recv(4-long_received)
long_received = len(data_received)
int_received = int.from_bytes(data_received, byteorder='big')
print("Received:", data_received, "Number:", int_received)
do_other_stuff(int_received)
data_received = b""
long_received = 0
编辑:添加了雷米·勒博的注释。非常感谢。
编辑2:正如用户user207421所说,这是TCP的行为,而不是Python。谢谢你,对我来说绝对是个新手