compareTo()在客户端/服务器应用程序中给出相互矛盾的结果?

时间:2013-07-17 01:06:14

标签: java string conditional-statements compareto

大家好:我对一个简单的多线程服务器/客户端应用程序有一个非常奇怪的问题。我目前有两个运行主机,运行说客户端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与“Bye!”不同,我打算进入if语句。或者“让我们玩!”。

注意颠倒if,即:

if(chat_msg.compareTo("Bye!") == 0 || chat_msg.compareTo("Let's play!") == 0)

导致语句输入 never 。因此,我倾向于相信@dasblinkenlight必须有一个看不见的角色。但是,我不确定如何找出它是什么,因为服务器字符串直接传递给共享变量。

请注意,equals()具有完全相同的效果,并且NetBeans调试器列出了没有额外空格的字符串(即"Let's play!")。

编辑2

@ SajalDutta的建议确实是对的!由于我将UDP与字节数组一起使用,似乎我的字符串的“长度”固定为1024,很可能用\ 0或其他类似填充。

最终修改

似乎我使用错误的String构造函数从Datagram中获取String。我使用的是String sentence = new String(receivePacket.getData());,而不是String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());

@SajalDutta,如果你想发布一个由上述内容组成的答案,我会接受它,因为它引导我得到了正确的答案。如果没有,经过一段时间后,我会接受最接近的一个。

2 个答案:

答案 0 :(得分:1)

首先,有时简单的逻辑表达式重新排列可以提高代码的可读性。例如,第二个条件等于以下(对我来说看起来更简单):

( chat_msg.compareTo("Bye!") != 0 && chat_msg.compareTo("Let's play!") != 0 )

其次,您的客户端 - 服务器通信协议可能会在字符串中添加一些空格字符(打印字符串时此字符不可见)。尝试使用调试器检查chat_msg的实际值。

答案 1 :(得分:1)

检查字符串的长度以查找某些不可打印的字符。 :)