模拟UDP聊天时,用equals比较接收到的内容失败

本文分析了一个UDP聊天程序的问题,当接收到'bye'时无法正确结束监听循环的原因。问题在于使用了错误的数据长度来创建字符串。解决方案包括修改字符串构造方法的参数,确保使用正确的数据长度,或者在比较时去除字符串前后的空格。这两个方案都能有效解决程序逻辑错误,确保当接收到'bye'时能正确关闭监听。
摘要由CSDN通过智能技术生成

问题描述:

模拟UDP聊天,当接收到发送方发过来的信息是bye的时候,结束listen里的循环。
但是这么写的话,发送方发过来"bye",listen方法if("bye".equals(receiveMsg))判断结果为false。

    public void listen() throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(listenPort);
        byte[] bytes = new byte[1024];

        DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
        while (true){
            datagramSocket.receive(datagramPacket);
            byte[] data = datagramPacket.getData();
            String receiveMsg =new String(data, 0, data.length);
            System.out.println(receiveMsg);
            System.out.println("bye".equals(receiveMsg));
            if("bye".equals(receiveMsg)){
                break;
            }
        }
        datagramSocket.close();
        System.out.println(Thread.currentThread().getName()+"end");
    }

bye
false


原因分析:

String receiveMsg =new String(data, 0, data.length);

这行代码的第3个参数送错了,在发送端输入"bye"时:data.length值为1024,datagramPacket.getLength()值为3,所以在用String receiveMsg =new String(data, 0, data.length);生成String时,实际上生成的是一个长度维1024的String,自然与长度为3的"bye"不相等。

        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
        byte[] data = datagramPacket.getData();
        System.out.println("data.length:"+data.length);//1024
        System.out.println("datagramPacket.getLength():"+datagramPacket.getLength());//3

解决方案:

方案一:
String receiveMsg =new String(data, 0, data.length);第三个参数改为datagramPacket.getLength()

    public void listen() throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(listenPort);
        byte[] bytes = new byte[1024];

        DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
        while (true){
            datagramSocket.receive(datagramPacket);
            byte[] data = datagramPacket.getData();
            //改法一
            //String receiveMsg =new String(data, 0, data.length);
            String receiveMsg =new String(data, 0, datagramPacket.getLength());
            System.out.println(receiveMsg);
            System.out.println("bye".equals(receiveMsg));
            if("bye".equals(receiveMsg)){
                break;
            }
        }
        datagramSocket.close();
        System.out.println(Thread.currentThread().getName()+"end");
    }

方案二:
if("bye".equals(receiveMsg))比较时先将receiveMsg去空格:

public void listen() throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(listenPort);
        byte[] bytes = new byte[1024];

        DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
        while (true){
            datagramSocket.receive(datagramPacket);
            byte[] data = datagramPacket.getData();
            String receiveMsg =new String(data, 0, data.length);
            System.out.println(receiveMsg);
            System.out.println("bye".equals(receiveMsg));
            //该法二:
            //if("bye".equals(receiveMsg)){
            if("bye".equals(receiveMsg.trim())){
                break;
            }
        }
        datagramSocket.close();
        System.out.println(Thread.currentThread().getName()+"end");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值