java - 比较相等的字符串时等于返回 false

标签 java string client-server equals bootp

我正在尝试用Java编写一个BOOTP客户端/服务器,RFC中的规范之一是客户端可以编写它想要连接的服务器的昵称。如果数据包到达的服务器不是指定的服务器,则应丢弃引导请求。

我有三个类(BOOTPClient、BOOTPServer 和 BOOTPMessage)。到目前为止,我已经成功地将引导请求从客户端发送到服务器,服务器收到它并开始处理它。

问题出在这里:

String sname = new String(btpmsg.getSname());
String serverName = args[0];
boolean discard = false;
System.out.println("|"+serverName+"|"+sname+"|");
if (!sname.equalsIgnoreCase("") && !sname.equalsIgnoreCase(serverName)) {
    discard = true;
    System.out.println("The request was not for this server. Server requested: "+sname);
}

这意味着:如果字符串不为空(在这种情况下我们不关心它到达哪个服务器),请确保它是正确的服务器。如您所见,我在“|”之间打印了两个字符串100% 确定不存在空格或任何可能扰乱比较的内容。然而,它进入if block 并执行里面的句子。如果字符串与服务器名称相同或者为空,都会发生这种情况。

澄清一下:btpmsg 是 BOOTPMsg 类的实例,服务器名称存储为字节数组(所有内容都使用 ByteArrayOutputStream 编码到字节数组中,以使用 DatagramPacket 发送),然后转换为字符串。不知道问题出在哪里。

输出示例:

服务器(用“java BOOTPServer bootpserver”调用):

Server bootpserver running. Awaiting requests.
Bootrequest received.
|bootpserver|bootpserver|
The request was not for this server. Server requested: bootpserver

客户:

Enter your IP if known. Otherwise, press enter.

Enter the IP of the server if known. Otherwise, press enter.

Enter the name of the server if known. Otherwise, press enter.
bootpserver
Enter the file name if known. Otherwise, press enter.

我将不胜感激任何帮助,因为我不知道我还能寻找什么错误。我最好的选择是在 ByteArrayOutputStream 上使用“write”方法或在 DataInputStream 中使用 readFully,但所有其他参数都可以正常工作。预先非常感谢。

最佳答案

您的getSname()方法返回固定长度64的byte[],这是sname字段中指定的长度BOOTP 协议(protocol)。当您直接将其传递给 String(byte[]) 构造函数时,您会得到一个字符串,该字符串右填充为长度 64,且包含零个字符。

要解决此问题,您需要找到数组中的第一个零字节并在构造字符串时使用它。另外请确保您传入显式字符编码;否则你将受到平台默认的摆布。

因此,使用如下代码:

sname2string(byte[] sname) {
   int length = 0;
   while (length < 64 && sname[length] != 0) length++;
   return new String(sname, 0, length, StandardCharsets.ISO_8859_1);
}

关于java - 比较相等的字符串时等于返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26572507/

相关文章:

java - Servlet线程调度

java - 如何获取 session 中所有已初始化的托管 bean?

c++ - 为什么不能 -O0 禁用 gcc 编译优化?

java - 客户端如何找到服务器的端口号?

python - 两个客户端无法在套接字客户端-服务器连接中相互通信

java - 响应正文中的 Spring Batch 作业执行状态

java - 下载后打开文件APK

c# - 如何创建一个在所有意图和目的上都像字符串一样的类型,因为我无法从字符串继承

java - 将二维数组的行返回为给定行号的逗号分隔字符串 Java

wpf - 处理 WPF 退出事件