簡體   English   中英

與equals()的Java字符串比較在UDP中無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM