【问题标题】:Java if statement fails when comparing two stringsJava if 语句在比较两个字符串时失败
【发布时间】:2016-04-05 04:45:48
【问题描述】:

这个问题整晚都让我头疼,我似乎无法弄清楚为什么它不起作用。 所以我正在运行一个客户端/服务器程序,让客户端通过 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

【问题讨论】:

  • 你能确保没有尾随空格或其他不可见字符吗?
  • 从输出看来,字符串“Hassan”已通过??
  • 不,没有!它没有进入“Inside if”块
  • 你到底是什么意思?
  • @HassanAli 你能打印接收到的数据的长度,即 request.getLength() 并在这里分享结果

标签: java if-statement server client


【解决方案1】:

构造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);

【讨论】:

    【解决方案2】:

    显然打印request.getLength() 解决了这个问题。 收到的响应被填充为响应缓冲区的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多