有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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语句

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

编辑: 我看到一些人误解了我的意图。正如@RanEldan对下面答案的评论所述,如果chat_msg不同于“再见”,我打算进入if语句或者“我们来玩吧!”

请注意,反转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,如果你想发布一个包含上述内容的答案,我会接受,因为这让我找到了正确的答案。如果没有,过一段时间我会接受最接近的


共 (2) 个答案

  1. # 1 楼答案

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

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

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

  2. # 2 楼答案

    检查字符串的长度是否有一些不可打印的字符。:)