0

大家好:我对一个简单的多线程服务器/客户端应用程序有一个非常奇怪的问题。我目前有两个正在运行的主机,它们运行客户端 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 语句。

这到底是怎么回事?我目前正在本地主机上测试这个应用程序,使用不同的端口对,所以应该不可能出现格式错误的数据包(即使有,它也不会返回完全相同的字符串!)。任何帮助将不胜感激。

编辑: 我看到有些人误解了我的意图。正如@RanEldan 作为对下面答案的评论所说,我打算进入 if 语句 ifchat_msg与“再见!”中的任何一个都不同。或“我们来玩吧!”。

请注意,反转 if,即:

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

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

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

编辑 2

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

最终编辑

似乎我使用了错误的字符串构造函数从数据报中获取字符串。我正在使用String sentence = new String(receivePacket.getData());, 而不是String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());

@SajalDutta,如果您想发布包含上述内容的答案,我会接受它,因为它使我得到了正确的答案。如果不是,我会在一段时间后接受最接近的那个。

4

2 回答 2

1

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

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

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

于 2013-07-17T01:24:50.673 回答
1

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

于 2013-07-17T01:49:15.413 回答