将字符串与字符串进行比较(DatagramPacket 中的字节数组)

Posted

技术标签:

【中文标题】将字符串与字符串进行比较(DatagramPacket 中的字节数组)【英文标题】:Compare String with String (Byte array from DatagramPacket) 【发布时间】:2016-02-12 23:19:55 【问题描述】:

所以我被要求创建一个 UDP 消息传递应用程序。我有两个从同一台计算机上的命令行运行的客户端,我试图让每个客户端在从另一个客户端接收到字符串 "exit" 时跳出 while 循环,因此它们都同时终止。

String input 是在此代码上方创建的,因此如果此客户端输入 "exit",则会跳过 while(这工作正常!)。

DatagramSocket receiveSocket = new DatagramSocket(8000); //Port 8000
byte[] receiveBuffer = new byte[65508];

while(!input.equals("exit")) 

    DatagramPacket packetToReceive = new DatagramPacket(receiveBuffer, receiveBuffer.length);

    receiveSocket.receive(packetToReceive);
    receiveBuffer = packetToReceive.getData();

    String receivedMessage = new String(receiveBuffer);


    if(!receivedMessage.equals("exit"))    
        System.out.println("A says: " + receivedMessage);
    
    else 
        input = "exit";
    

我遇到的问题是我无法让!receivedMessage.equals("exit") 等同于false,即使当我执行System.out.println(receivedMessage) 时,我得到"exit"。它们看起来完全一样,但显然不是。 我尝试过强制编码,例如...

String receivedMessage = new String(receiveBuffer, "UTF-8");

...但没有任何效果。我尝试了许多其他强制编码的组合,加上将receivedMessage 转换为字节数组、字符数组等进行比较,并且我检查了receivedMessage 两侧的空白,仍然没有。

任何帮助将不胜感激。它必须是我想念的小东西。 谢谢。

【问题讨论】:

【参考方案1】:

receiveBuffer 大小可能存在问题。目前,您正在发送数据包中的“exit”,该数据包小到足以容纳 65508 个字节。因此,receiveBuffer 中的剩余字节只是空的或包含特殊字符。这就是为什么当您收到数据包并将数据放入字符串时,剩余的字节也在字符串中。

您可以使用contains() 而不是equals() 来比较字符串,也可以只将包含实际消息的所需字节放入receiveBuffer。这是实现这一目标的一种可能方法:

receiveSocket.receive(packetToReceive);
receiveBuffer = new byte[packetToReceive.getLength()];
System.arraycopy(packetToReceive.getData(), packetToReceive.getOffset(), receiveBuffer, 0, packetToReceive.getLength());

String receivedMessage = new String(receiveBuffer);

if(!receivedMessage.equals("exit"))    
    System.out.println("A says: " + receivedMessage);

else 
    input = "exit";

【讨论】:

感谢您的洞察力!改用contains() 就可以了,因为它只是大学作业的概念证明,但我很高兴知道为什么equals() 不起作用。以为我要疯了!【参考方案2】:

可能在 receivedMessage 中有一些前导或尾随空格。尝试修剪它。

【讨论】:

【参考方案3】:
receiveSocket.receive(packetToReceive);
receiveBuffer = packetToReceive.getData();
String receivedMessage = new String(receiveBuffer);

问题就在这里。您忽略了接收数据包的长度。最后两行可以改成这样:

String receivedMessage = new String(packetToReceive.getData(), packetToReceive.getOffset(), packetToReceive.getLength());

【讨论】:

以上是关于将字符串与字符串进行比较(DatagramPacket 中的字节数组)的主要内容,如果未能解决你的问题,请参考以下文章

将字符串与字符序列进行比较

将字符串与容差进行比较

将 const char 与字符串进行比较

将 JSON 响应与字符串进行比较

将输入数组与字符串进行比较

如何将对象属性名称与字符串进行比较?