我有一个android java应用程序通过套接字发送字节,该套接字连接到运行Python服务器的主机。我需要从python套接字发送这些字节。我在Python' socket.recv'中看到了这一点。只返回一个字符串。当我从java应用程序发送ASCII字符串时,我能够在python服务器中正确地接收数据,但是当我使用java字节发送二进制数据时,我看到收到的数据不一样。我需要在Python中接收原始字节,以使我的协议正常工作。请指出我正确的方向。
在套接字上发送数据的代码段:
private void sendFrameMessage(byte[] data) {
byte[] lengthInfo = new byte[4];
Log.v(TAG, "sendFrameMessage");
for(int i=0; i<data.length; i++) {
Log.v(TAG, String.format("data[%d] = %d", i, data[i]));
}
try {
lengthInfo[0] = (byte) data.length;
lengthInfo[1] = (byte) (data.length >> 8);
lengthInfo[2] = (byte) (data.length >> 16);
lengthInfo[3] = (byte) (data.length >> 24);
DataOutputStream dos;
dos = new DataOutputStream(mSocket.getOutputStream());
dos.write(lengthInfo, 0, 4);
dos.write(data, 0, data.length);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
接收方的Python代码
def recvFrameMessage(self, s):
recv_count = 4;
data = s.recv(recv_count)
if data == 0:
return None
total_rx = len(data)
lenInfo = data
while total_rx < recv_count:
data = s.recv(recv_count - total_rx)
if data == 0:
return None
total_rx += len(data)
lenInfo = lenInfo + data
recv_count = self.decodeFrameLen(lenInfo)
logger.info("length = %d" % recv_count)
data = s.recv(recv_count)
total_rx = len(data)
msg = data
while total_rx < recv_count:
data = s.recv(recv_count - total_rx)
if data == 0:
return None
total_rx += len(data)
msg = msg + data
logger.info("msg = " + msg)
for i in range(0, len(msg)-1):
logger.info("msg[%d] = %s" % (i, msg[i]))
return msg
答案 0 :(得分:1)
读取二进制数据是完全可行的,但如果Android应用程序的二进制表示与Python服务器上的字节表示不同,该怎么办?从Python文档:
完全可以通过套接字发送二进制数据。专业 问题是并非所有机器都使用相同的二进制数据格式。 例如,摩托罗拉芯片将代表一个16位整数 值为1作为两个十六进制字节00 01.但是,Intel和DEC是 字节反转 - 同样的1是01 00.套接字库需要调用 转换16和32位整数 - ntohl,htonl,ntohs,htons在哪里 “n”表示网络,“h”表示主机,“s”表示短,“l”表示 长。如果网络订单是主机订单,那么它们什么也不做,但在哪里 机器是字节反转的,这些交换字节 适当。
如果没有代码和示例输入/输出,这个问题将很难回答。我认为问题是表示不同。最可能的问题是Java使用大端,而Python遵循你运行它的任何机器。如果您的服务器使用小端,那么您需要考虑到这一点。有关endianness的详细说明,请参阅此处。
答案 1 :(得分:1)
@SteveP为“具有某种结构”的二进制数据提供了优点,但如果这是一个普通的字节流,则在Python 2中只需将ord()
函数应用于从套接字获得的每个“字符”。例如,如果Java端发送一个NUL字节,它将在Python端显示为字符"\x00"
,然后:
>>> ord("\x00")
0
转换整个字符串s
,
map(ord, s)
返回相应的8位无符号整数的列表。
我在这里假设Python 2.