gpt4 book ai didi

java - DatagramPacket 未传输正确的消息

转载 作者:行者123 更新时间:2023-12-02 08:09:55 26 4
gpt4 key购买 nike

我正在使用 UDP 传输实现客户端/服务器应用程序。这是我的代码的一部分:

客户端:

InetAddress serverAddress = ...
int serverPort = ...
DatagramSocket socket = new DatagramSocket(9999);

...

String message = "<HELLO>";

byte[] outbuffer = new byte[1000];
outbuffer = message.getBytes();
DatagramPacket packet = new DatagramPacket(outbuffer, outbuffer.length, serverAddress, serverPort);
socket.send(this.packet);

服务器:

DatagramSocket serverSocket =  new DatagramSocket(9876);

...

byte[] inbuffer = new byte[1000];
DatagramPacket packet = new DatagramPacket(inbuffer, inbuffer.length);
serverSocket.receive(packet);
String response = new String(packet.getData(), 0, packet.getLength());

System.out.println(response);

if("<HELLO>".equals(response)){
System.out.println("OK");
} else {
System.out.println("ERROR");
}

我的问题如下:如果我在客户端打印来自客户端的响应字符串,则一切看起来都很好(“”)。但由于某些原因,当我尝试使用 .equals 或 RegExp 比较来自服务器的响应时,它失败了!

可能与字符串编码有关,但我不知道它在哪里以及为什么失败。客户端和服务器现在都在同一主机上运行,​​因此可能与 JVM 差异无关。

最佳答案

您当前正在使用平台默认编码来对字符串进行编码和解码。您绝对不应该这样做。在 getBytes() 调用和构造函数调用中指定编码,例如

byte[] outBuffer = message.getBytes("UTF-8");

另请注意,您当前的代码创建了一个长度为 1000 的字节数组,然后立即将其丢弃:

byte[] outbuffer = new byte[1000];
// Byte array created on previous line is now useless!
outbuffer = message.getBytes();

...不要这样做。

我们无法从您提供给我们的代码中得知更多信息 - 如果您可以生成简短但完整的程序来演示该问题,那确实会有帮助。

为了进行调试,我建议您记录收到的数据报数据包的内容,同时仍以二进制形式记录。大概这不是您所期望的,但这无助于显示它是什么。

编辑:这是两个简短但完整的程序,可以工作:

import java.net.*;

public class Server {
public static void main(String[] args) throws Exception{
DatagramSocket socket = new DatagramSocket(9999);
byte[] inbuffer = new byte[1000];
DatagramPacket packet = new DatagramPacket(inbuffer, inbuffer.length);
socket.receive(packet);
String response = new String(packet.getData(), 0,
packet.getLength(), "UTF-8");

System.out.println(response);

if("<HELLO>".equals(response)){
System.out.println("OK");
} else {
System.out.println("ERROR");
}
}
}

// Client.java
import java.net.*;

public class Client {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
byte[] output = "<HELLO>".getBytes("UTF-8");
DatagramPacket packet = new DatagramPacket(output, output.length,
InetAddress.getLocalHost(),
9999);
socket.send(packet);
}
}

关于java - DatagramPacket 未传输正确的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7626056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com