Java if 语句在比较两个字符串时失败
Java if statement fails when comparing two strings
这个问题整晚都在困扰我,我似乎无法弄清楚为什么它不起作用。
所以我是运行一个client/server程序,让客户端通过JOptionPane输入某个字符串,然后发送给服务器。服务器有一个字符串数组,它检查从客户端收到的字符串是否等于数组中的一个字符串。但是,比较似乎失败了。如果有人能告诉我为什么会遇到这个问题,我会很高兴。
下面是我的服务器的代码,其中 if 语句在 for 循环和数组 (usrs) 内失败:
String [] usrs = {"Hassan","Jimmy","Bob","Kevin"};
DatagramSocket skt = null;
try {
skt = new DatagramSocket(2002);
byte [] buffer = new byte [1000];
String okay = "OK";
while(true) {
System.out.println("Inside loop");
DatagramPacket request = new DatagramPacket(buffer,buffer.length);
skt.receive(request);
String userName = (new String(request.getData()));
System.out.println(userName);
for (int i=0; i < usrs.length; i++) {
System.out.println(usrs[i]);
//if user exists in list of verified users,we send the RSA encrypted AES Key using that user's public key which we receive from the user
if (userName.equals(usrs[i])) {
System.out.println("Inside If");
byte [] okayMsg = okay.getBytes();
DatagramPacket reply = new DatagramPacket(okayMsg,okayMsg.length,request.getAddress(),request.getPort());
skt.send(reply);
skt.close();
}
}
}
这是我的客户端代码:
try {
skt = new DatagramSocket();
String userName = JOptionPane.showInputDialog(null,"Please enter your username");
byte [] b = userName.getBytes();
InetAddress host = InetAddress.getByName("localhost");
int serverSocket = 2002;
DatagramPacket request = new DatagramPacket(b,b.length,host,serverSocket);
skt.send(request);
byte [] buffer = new byte[1000];
DatagramPacket reply = new DatagramPacket(buffer,buffer.length);
skt.receive(reply);
String replyData = new String(reply.getData());
System.out.println(replyData);
skt.close();
} catch(Exception e) {
e.printStackTrace();
};
这是输出:
Inside loop
Hassan
Hassan
Jimmy
Bob
Kevin
Inside loop
显然打印 request.getLength()
可以解决问题。
收到的响应被填充为响应缓冲区的大小。
构造replyData
时需要检查DatagramPacket
的长度:
String replyData = new String(reply.getData(), 0, reply.getLength());
否则假设reply.getData()
返回的整个数组包含字符串数据,事实并非如此,如您所见。
使用显式字符编码也是明智的,这样您就不会因为客户端和服务器 JVM 上的默认字符编码不匹配而出现奇怪的行为:
byte [] b = userName.getBytes(StandardCharsets.UTF_8);
和
String replyData = new String(..., StandardCharsets.UTF_8);
这个问题整晚都在困扰我,我似乎无法弄清楚为什么它不起作用。 所以我是运行一个client/server程序,让客户端通过JOptionPane输入某个字符串,然后发送给服务器。服务器有一个字符串数组,它检查从客户端收到的字符串是否等于数组中的一个字符串。但是,比较似乎失败了。如果有人能告诉我为什么会遇到这个问题,我会很高兴。
下面是我的服务器的代码,其中 if 语句在 for 循环和数组 (usrs) 内失败:
String [] usrs = {"Hassan","Jimmy","Bob","Kevin"};
DatagramSocket skt = null;
try {
skt = new DatagramSocket(2002);
byte [] buffer = new byte [1000];
String okay = "OK";
while(true) {
System.out.println("Inside loop");
DatagramPacket request = new DatagramPacket(buffer,buffer.length);
skt.receive(request);
String userName = (new String(request.getData()));
System.out.println(userName);
for (int i=0; i < usrs.length; i++) {
System.out.println(usrs[i]);
//if user exists in list of verified users,we send the RSA encrypted AES Key using that user's public key which we receive from the user
if (userName.equals(usrs[i])) {
System.out.println("Inside If");
byte [] okayMsg = okay.getBytes();
DatagramPacket reply = new DatagramPacket(okayMsg,okayMsg.length,request.getAddress(),request.getPort());
skt.send(reply);
skt.close();
}
}
}
这是我的客户端代码:
try {
skt = new DatagramSocket();
String userName = JOptionPane.showInputDialog(null,"Please enter your username");
byte [] b = userName.getBytes();
InetAddress host = InetAddress.getByName("localhost");
int serverSocket = 2002;
DatagramPacket request = new DatagramPacket(b,b.length,host,serverSocket);
skt.send(request);
byte [] buffer = new byte[1000];
DatagramPacket reply = new DatagramPacket(buffer,buffer.length);
skt.receive(reply);
String replyData = new String(reply.getData());
System.out.println(replyData);
skt.close();
} catch(Exception e) {
e.printStackTrace();
};
这是输出:
Inside loop
Hassan
Hassan
Jimmy
Bob
Kevin
Inside loop
显然打印 request.getLength()
可以解决问题。
收到的响应被填充为响应缓冲区的大小。
构造replyData
时需要检查DatagramPacket
的长度:
String replyData = new String(reply.getData(), 0, reply.getLength());
否则假设reply.getData()
返回的整个数组包含字符串数据,事实并非如此,如您所见。
使用显式字符编码也是明智的,这样您就不会因为客户端和服务器 JVM 上的默认字符编码不匹配而出现奇怪的行为:
byte [] b = userName.getBytes(StandardCharsets.UTF_8);
和
String replyData = new String(..., StandardCharsets.UTF_8);