【问题标题】:Socket connection between Java and Python - struct.unpack errorJava 和 Python 之间的套接字连接 - struct.unpack 错误
【发布时间】:2014-08-21 00:38:53
【问题描述】:

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

unpack 需要一个长度为 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

【问题讨论】:

  • 你最好将数据序列化为适合网络通信的格式,比如 JSON/XML,同时避免字节顺序、字节序等,否则你的方法会变得混乱!
  • 您能否为该解包行添加 try 和 except catch,当您确实捕获异常时,将数据打印出来?这样你就知道当你的代码抛出异常时数据变量包含什么

标签: java python sockets


【解决方案1】:

来自 Python 的文档:

socket.recv(bufsize[, flags])

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

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

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

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

另外,我需要更正我之前所说的话。你不需要睡几毫秒(又名,显式调用time.sleep(a_few_milliseconds),你可以立即再次调用recv,它会阻塞直到有新数据。如果新数据真的到达几微秒,您不会在睡眠中浪费几毫秒

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2013-05-21
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多