繁体   English   中英

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

[英]Socket connection between Java and Python - struct.unpack error

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

解压缩需要一个长度为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)。 它默认为零。

size您传入recv是最大尺寸。 因此,在读取时,只要缓冲区中有数据,该函数将立即返回该字节数。 因此,您可以将3字节的字符串解析为整数(需要4个字节)。

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

[编辑]发现了这篇文章,讨论了类似的内容: 来自Java客户端的Python socket recv

另外,我需要纠正我之前所说的内容。 您不需要休眠数毫秒 (也就是显式调用time.sleep(a_few_milliseconds) ,您可以立即再次调用recv ,它将阻塞直到有新数据。如果新数据实际上在几微秒内到达,您就不必不会浪费数毫秒的睡眠时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM