Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python和Java数据报套接字之间传递JSON数据_Java_Python_Json_Sockets_Datagram - Fatal编程技术网

在Python和Java数据报套接字之间传递JSON数据

在Python和Java数据报套接字之间传递JSON数据,java,python,json,sockets,datagram,Java,Python,Json,Sockets,Datagram,嗨,我有一个非常简单的Java服务器和两个客户端。一个客户端是基于Java的,另一个是基于python的。当我将任何字符串从Java客户机发送到Java服务器或从Java服务器发送到Java客户机时,都可以正常工作。当我将任何字符串从Java发送到python时,它也可以正常工作。但是,当我从python发送一个字符串(由python json库使用json.dumps生成)时,我会收到一个Java缓冲区,其中包含所需的数据和空字节。没有显示字符串的开始或结束。如何将其转换回相同长度的字符串。目

嗨,我有一个非常简单的Java服务器和两个客户端。一个客户端是基于Java的,另一个是基于python的。当我将任何字符串从Java客户机发送到Java服务器或从Java服务器发送到Java客户机时,都可以正常工作。当我将任何字符串从Java发送到python时,它也可以正常工作。但是,当我从python发送一个字符串(由python json库使用json.dumps生成)时,我会收到一个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);
...
...
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))
...
...
python的发送方代码如下所示

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);
...
...
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新手,所以可能会犯一些愚蠢的错误。请提供帮助。

在java代码中,您使用1024字节的缓冲区来接收udp数据包,只有当您没有收到足够的字节时,才会部分填充udp数据包
receivePacket.getData()
只返回此缓冲区

然后,当您将其转换为字符串时,剩下的字节当然将被之前缓冲区中的内容填充(在本例中为零字节,但如果您之前将其用作接收缓冲区,则可以用内容填充als)

获取接收数据的正确方法是使用
DatagramPacket
getLength()
getOffset()
方法:

strData = new String(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());

在java代码中,您使用一个1024字节的缓冲区来接收udp数据包,只有当您没有收到足够的字节时,才会部分填充udp数据包
receivePacket.getData()
只返回此缓冲区

然后,当您将其转换为字符串时,剩下的字节当然将被之前缓冲区中的内容填充(在本例中为零字节,但如果您之前将其用作接收缓冲区,则可以用内容填充als)

获取接收数据的正确方法是使用
DatagramPacket
getLength()
getOffset()
方法:

strData = new String(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());

但是它如何处理来自JAVA客户端的任何消息。。。只有当我从Python发送数据时才会发生这种情况。在Python中,接收代码是不同的,
sokset.recv(buflen)
不返回使用的缓冲区,而是返回与接收到的字节数相同的字节数(最多为buflen),因此如果java代码中没有发送任何零字节,在python方面你看不到任何东西。但是它是如何处理来自JAVA客户端的任何消息的。。。只有当我从Python发送数据时才会发生这种情况。在Python中,接收代码是不同的,
sokcet.recv(buflen)
不会返回使用过的缓冲区,而是返回接收到的字节数(最多为buflen),因此如果java代码中没有发送任何零字节,那么在Python端就看不到任何字节。