将字符串与字符串进行比较(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 中的字节数组)的主要内容,如果未能解决你的问题,请参考以下文章