1

こんにちは、私は非常に単純な Java サーバーと 2 つのクライアントを持っています。1 つのクライアントは Java ベースで、もう 1 つは Python ベースです。JavaクライアントからJavaサーバーに、またはその逆に文字列を送信すると、正常に機能します。Java から python に任意の文字列を送信すると、正常に動作します。しかし、json.dumpsを使用してpython json libによって生成されたpythonから文字列を送信すると、必要なデータとnullバイトを含むJavaのバッファを受け取ります。文字列の開始または終了の表示はありません。同じ長さの文字列に戻すにはどうすればよいですか。現在、JSON データが終了した後、文字列には多くの null バイトが含まれているため、その文字列を正しく解析できません。

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が初めてなので、私がやっているばかげた間違いがあるかもしれません。助けてください。

4

1 に答える 1

1

あなたの Java コードでは、1024 バイトのバッファを使用して udp パケットを受信します。これは、十分なバイトを受信しない場合に部分的にのみ満たされます。receivePacket.getData()単純にこのバッファを返します。

次にそれを文字列に変換すると、もちろん、残りのバイトは以前にバッファにあったもので満たされます (この場合はゼロバイトですが、以前に受信バッファとして使用した場合はコンテンツで満たされる可能性があります)。

受信したデータを取得する正しい方法は、次のgetLength()およびgetOffset()メソッドを使用することDatagramPacketです。

strData = new String(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());
于 2013-04-24T12:29:20.067 に答える