以下是简单的 UDP 客户端-服务器类:
UDP服务器:
import java.net.*;
/**
* Source:https://systembash.com/a-simple-java-udp-server-and-udp-client/
*
*/
class UDPServer {
public static void main(String args[]) throws Exception {
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while (true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String(receivePacket.getData());
// Sentence here is not equal "PING" ?
if(sentence.equals("PING")) {
System.out.println("It is PING: " + sentence);
} else {
System.out.println(sentence.getClass());
System.out.println("It is not equal PING. It is <" + sentence + ">");
}
System.out.println("RECEIVED: " + sentence);
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
String capitalizedSentence = "PONG";
sendData = capitalizedSentence.getBytes();
DatagramPacket sendPacket
= new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
}
}
UDP客户端:
import java.net.*;
/**
* Source:
* https://systembash.com/a-simple-java-udp-server-and-udp-client/
*
* @author
*/
class UDPClient {
public static void main(String args[]) throws Exception {
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("localhost");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = "PING";
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
}
}
在 UDPServer 中,检查响应(变量语句)。由于某种原因,equals 在必须检测到“PING”时没有检测到。而且它输出的句子字符串是“PING”,类字符串。 这是为什么 ?
UDPServer 的输出是 else:
class java.lang.String
It is not equal PING. It is:<PING>
RECEIVED: PING
如果重要的话,java 版本是“1.7.0_91”。
最佳答案
getData() 为您提供一个缓冲区,您可以从中获取数据。
不要使用trim(),因为这可能会删除您真正想要保留的字符(除了昂贵之外)
相反,您应该使用消息的长度
String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());
这样,您将只提取所需数据的缓冲区部分。
关于Java字符串等于不适用于UDP服务器收到的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34104935/