大家好:我在一个简单的多线程服务器/客户端应用程序上遇到了一个非常奇怪的问题。我目前有两个正在运行的主机,比如客户端1和服务器1,另一个运行C2和S2。C1向S2发送消息,然后S2与C2共享该消息。然后,我根据发送的数据(字符串)做不同的事情。
然而,我的一些比较给出了冲突的结果。例如(own_msg
是指主机客户端自己发送的字符串,chat_msg
是指它通过服务器从另一个客户端接收的字符串):
if(own_msg.compareTo("Let's play!") == 0 || own_msg.compareTo("Bye!") == 0)
{
break;
}
只要主机客户端本身确实选择了这些选项,这种方法就会起作用。
然而,这并不是:
if( !( chat_msg.compareTo("Bye!") == 0 || chat_msg.compareTo("Let's play!") == 0 ))
出于某种原因,这总是正确的。即使我将chat_msg的内容打印到屏幕上(从服务器和接收chat_msg
的客户端),并且知道肯定该语句的结果应该是错误的。例如,chat_msg = "Let's play!"
确实进入前面提到的if语句。
到底是怎么回事?我目前正在localhost上测试这个应用程序,使用不同的端口对,所以不应该有格式错误的数据包的可能性(即使有,它也不会返回完全相同的字符串!)。如有任何帮助,我们将不胜感激。
编辑:我看到有些人误解了我的意图。正如@RanEldan对以下答案的评论所说,如果chat_msg
与"再见!"或"让我们玩吧!"不同,我打算进入if语句。
请注意,反转if,即:
if(chat_msg.compareTo("Bye!") == 0 || chat_msg.compareTo("Let's play!") == 0)
导致从不输入的语句。因此,我倾向于相信@dasblinkenlight一定有一个看不见的角色。然而,我不确定如何找到它,因为服务器字符串直接传递到共享变量中。
请注意,equals()具有完全相同的效果,并且NetBeans调试器列出的Strings没有额外的空白(即"Let's play!"
)。
编辑2:
@萨哈尔·杜塔的建议确实正确!由于我将UDP与字节数组一起使用,所以字符串的"长度"似乎固定为1024,很可能用\0或类似的东西填充。
最终编辑:
我似乎使用了错误的String构造函数来从Datagram中获取String。我使用的是String sentence = new String(receivePacket.getData());
,而不是String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());
@SajalDutta,如果你想发布一个由以上内容组成的答案,我会接受,因为它让我找到了正确的答案。如果没有,过一段时间我会接受最接近的。
检查字符串长度中是否有一些不可打印的字符。:)
首先,有时逻辑表达式的简单重新排列可以提高代码的可读性。例如,第二个条件等于以下(对我来说看起来更简单):
( chat_msg.compareTo("Bye!") != 0 && chat_msg.compareTo("Let's play!") != 0 )
其次,您的客户端-服务器通信协议可能会在字符串中添加一些空白字符(当您打印字符串时,这个字符不可见)。尝试使用调试器检查chat_msg
的实际值。