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

时间:2014-08-21 00:38:54

标签: java python sockets

我通过套接字使用int向Python发送DataOutputStream,但我在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

1 个答案:

答案 0 :(得分:2)

来自Python的文档:

socket.recv(bufsize[, flags])

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

您传入size的{​​{1}}是最大尺寸。所以在读取时,只要缓冲区中有数据,该函数就会立即返回该字节数。所以你可以将一个3字节的字符串解析成一个整数(需要4个字节)。

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

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

另外,我需要纠正我之前说的话。您不需要睡几毫秒(也就是说,明确调用recv,您可以立即再次呼叫time.sleep(a_few_milliseconds),它会阻止,直到有新数据。如果新数据确实以几微秒的速度到达,那么您就不会在睡眠中浪费几毫秒