Python socket接收并存储数据
我在一个C++程序和一个Python脚本之间建立了一个套接字(socket)。这很简单,我想从C程序向Python发送大约20赫兹的坐标。这只是第一次尝试,我想发送一组坐标,格式如下:
C++程序,作为服务器:
struct coord {
int x;
int y;
int z;
};
struct coord co;
co.x = 1;
co.y = 2;
co.z = 3;
char *msg;
msg = (char*) &co;
send(newsockfd, msg,strlen((char*) &co), 0);
这部分很重要,在这之前我已经成功初始化了一个具有特定地址的套接字。现在我想把这三个坐标发送给Python程序。我发送的是第一个整数的地址(co.x),以及分配的内存,应该是12个字节。
这是Python脚本。同样,我只包含了重要的部分。
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect(server_address)
recvInt = sock.recv(4096)
现在我想访问前4个字节,并将其存储在一个变量中,接下来的4个字节存储在另一个变量中,最后的4个字节存储在第三个变量中。但是我该怎么做呢?recvInt是一个看起来没用的对象Bytes,我还没能把它转换成其他东西,打印出来的结果也没有任何意义。有人能帮我或者指点我正确的方向吗?
编辑:当我打印type(recvInt)时,它显示是一个字符串。这也很奇怪,因为socket.recv()函数的文档明确说明它返回的是Bytes。不过,现在我也发现文档说这个函数应该返回数据的字符串表示。哪个是正确的呢?而这个所谓的字符串表示只是一个包含四个数字的小框,看起来像是字节的可视化表示。然而msg包含12个字节,而recvInt没有索引。
感谢你!1 个回答
1
看看这个struct库,它是Python中的一个工具。
简单来说,对于你的情况,下面这样的代码可能会有效。
import struct
x, y, z = struct.unpack("!iii", receivedData)
上面的代码会把接收到的字符串解析成3个带符号的整数。
socket.recv
这个函数会返回一个二进制字符串,实际上就是一个字节数组。Python并没有为接收整数或解析整数提供单独的函数,而是提供了一个库,可以把任意的二进制字符串解析成不同大小的整数或字符串。