gpt4 book ai didi

java - Java 和 Python 之间的套接字连接 - struct.unpack 错误

转载 作者:行者123 更新时间:2023-12-02 05:32:15 25 4
gpt4 key购买 nike

我通过套接字使用 DataOutputStream 向 Python 发送 int,但我在 Python 部分收到的数据偶尔会损坏,并收到以下错误:

unpack requires a string argument of length 4

更不用说我反复运行Java部分了。我不知道为什么会发生这种情况。请帮忙。

这是 Java 部分:

public static void main(String[] args) {

Socket sock = null;
DataOutputStream out = null;

try {
sock = new Socket("192.168.0.104", 1234);
out = new DataOutputStream(sock.getOutputStream());

out.writeInt(2);
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.close();
sock.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

这是 Python 部分:

import socket
import struct

host = '192.168.0.104'
port = 1234
backlog = 5
size = 4
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(backlog)
while 1:
client, address = s.accept()
data = client.recv(size)
unpacked = int(struct.unpack('>i', data)[0])
if data:
print unpacked
client.close()

这是输出:

2
2
2
Traceback (most recent call last):
File "test_socket1.py", line 20, in <module>
unpacked = int(struct.unpack('>i', data)[0])
struct.error: unpack requires a string argument of length 4

最佳答案

来自Python的文档:

socket.recv(bufsize[, flags])

从套接字接收数据。返回值是一个表示接收到的数据的字符串。一次接收的最大数据量由bufsize指定。有关可选参数标志的含义,请参阅 Unix 手册页 recv(2);默认为零。

您传递给 recvsize 是最大大小。因此,在读取时,只要缓冲区中有数据,函数就会立即返回该字节数。因此,您可以将 3 字节字符串解析为整数(需要 4 字节)。

我建议您检查收到的字节长度。如果小于 4,请 hibernate 几毫秒,然后重试。最后,在解析之前将所有段连接成一个。

[编辑]发现这篇文章谈论类似的事情: Python socket recv from java client

另外,我需要纠正一下我之前说的话。您不需要 sleep 几毫秒(又名,显式调用time.sleep(a_few_milliseconds),您可以立即再次调用recv,它会阻塞,直到有新数据为止。如果新数据实际上在几微秒内到达,您就不会在 sleep 中浪费几毫秒

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

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