Python套接字recv正在拆分收到的消息



我正在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_stuffsys.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。谢谢你,对我来说绝对是个新手

最新更新