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

标签 java python sockets

我通过套接字使用 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/

相关文章:

java - 正则表达式来查看字符串是否包含模式

java - 将对象返回到 Double 或 double 的通用方法

c++ - Boost Python , python 函数和 ptrs

java - 在Java中通过套接字传输文件的缓冲区大小应该是多少

java - 命名参数和位置参数之间的性能差异

java - 无法使用 hibernate validator 验证枚举中的数据

Python Pandas - 创建包含节点对和边强度的 DataFrame

python - 如何使用Django访问网页数据?

ruby-on-rails - 如何告诉服务器EOF是否为ruby套接字

Delphi服务器套接字组件