[英]Java string comparison with equals() not working as expected with UDP
我正在嘗試通過UDP發送一條消息,並將其與字符串文字進行比較,但這似乎不起作用。
這是UDP服務器代碼
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Controller {
public static void main(String args[]) {
//create UDP server
try {
DatagramSocket socket = new DatagramSocket(5002);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
//wait for done message
socket.receive(packet);
String msg = new String (packet.getData());
if(msg.equals("Done"))
{
System.out.println("Done received");
}
else {
System.out.println("Done not received");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
這是UDP客戶端代碼
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Slave {
public static void main(String args[]) {
//create UDP client
try {
DatagramSocket socket = new DatagramSocket();
byte[] buffer;
//send Done message
buffer = "Done".getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getLocalHost(), 5002);
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
}
}
}
即使發送完成消息,我得到的輸出也是“未收到”。 代碼有什么問題?
問題是,您正在聲明一個1024個字節的緩沖區,即將轉換為字符串。 該字符串不等於“ Done”,只是“太長”。 您必須獲取發送數據的實際長度。 您可以在Controller
:
public class Controller {
public static void main(String args[]) {
//create UDP server
try {
DatagramSocket socket = new DatagramSocket(5002);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
//wait for done message
socket.receive(packet);
//Get actual data length and copy it
byte[] data = new byte[packet.getLength()];
System.arraycopy(packet.getData(), packet.getOffset(), data, 0, packet.getLength());
//Create string from actual data
String msg = new String (data);
if(msg.equals("Done"))
{
System.out.println("Done received");
}
else {
System.out.println("Done not received");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
String msg = new String(packet.getData(), packet.getOffset(), packet.getLength());
DatagramPacket
包含其他信息,例如端口和主機。 在數據上調用new String()
將提取的信息不僅僅是數據消息。 使用packet.getData()
並設置偏移量將確保您只提取數據包中的數據,而忽略端口和主機。
有關更多信息,請參見JavaDocs for DatagramPacket 。
當我調試您的代碼時,我可以看到消息是“ Done”,並且后面跟着許多“ \\ u0000”,這似乎是Unicode表示形式0
因此,您可以刪除零或將if語句更改為
msg.startsWith("Done")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.