您好我有一个非常简单的Java服务器和两个客户端。一个客户端是基于Java的,另一个是基于python的。当我从Java客户端发送任何字符串到java服务器或反之亦然时它工作正常。当我从Java发送任何字符串到python它也工作正常。但是当我使用json.dumps从python json lib生成的python中发送一个字符串时,我收到一个包含所需数据和空字节的Java缓冲区。没有迹象表明字符串的开头或结尾。我如何将其转换回相同长度的字符串。目前,在JSON数据完成后,字符串有很多空字节,这就是为什么我无法正确解析该字符串。
接收Java代码就是这样。
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
CtrlChannel.getSocket().receive(receivePacket);
strData = new String(receivePacket.getData());
System.out.println("FROM PYTHON:" + strData);
python的发件人代码是这样的。
...
...
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
data = {}
data["type1"] = "type1"
data["type2"] = "type2"
data["type3"] = "type3"
data["type4"] = "type4"
data_string = json.dumps(data)
sock.sendto(data_string, (addr[0], 36963))
...
...
我是Java的新手,所以我可能会犯一些愚蠢的错误。请帮助。
答案 0 :(得分:1)
在你的java代码中,你使用一个1024字节的缓冲区来接收udp数据包,只有当你没有收到足够的字节时才会被部分填充。 receivePacket.getData()
只返回此缓冲区。
当你将它转换为String时,当然剩下的字节将填充之前缓冲区中的任何内容(在这种情况下是零字节,但如果你以前用它作为接收缓冲区,也可以用内容填充)
获取接收数据的正确方法是使用getLength()
的{{1}}和getOffset()
方法:
DatagramPacket