【发布时间】:2014-08-21 00:38:53
【问题描述】:
我通过套接字使用DataOutputStream 将int 发送到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,当您确实捕获异常时,将数据打印出来?这样你就知道当你的代码抛出异常时数据变量包含什么