刻苦的樊同学 2019-09-06 12:57 采纳率: 0%
浏览 357

UDP模拟客户端和服务端聊天不能连续发送消息?

使用UDP模拟客户端和服务端聊天,但是客户端发送一条消息之后就不能再连续发了,只能等服务端响应之后才能接着发送第二条,怎么解决这个问题啊?求大牛讲解?

下面是源码

服务端

public class Server {
    public static void main(String[] args) throws IOException {

        Scanner scanner=new Scanner(System.in);
        //服务端(接收方)的端口
        DatagramSocket ds=new DatagramSocket(8886);
        System.out.println("服务端已经启动!");
        while(true) {
            //准备收数据
            byte[] b=new byte[1024];
            DatagramPacket dp=new DatagramPacket(b, b.length);
            //开始收  收到的是字节数组
            ds.receive(dp);
            System.out.println(new String(dp.getData(),0,dp.getLength()));
            System.out.println("对方IP地址:"+dp.getAddress()+"  "+"端口:"+dp.getPort());

            //发数据
            //准备数据
            String s=scanner.next();
            byte[] buf=s.getBytes();
            //打包
            DatagramPacket dp2=new DatagramPacket(buf, buf.length,dp.getAddress(),dp.getPort());
            ds.send(dp2);
            if("bye".equals(s)) {
                break;
            }

        }
        ds.close();
    }
}

客户端

public class Client {

    public static void main(String[] args) throws SocketException, IOException {

        Scanner scanner=new Scanner(System.in);
        //发数据
        DatagramSocket ds=new DatagramSocket(9999);//客户端的端口号是9999
        System.out.println("客户端已经启动,开始聊天吧?!");
        while(true) {

            String s=scanner.next();
            byte[] buf=s.getBytes();

            DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"),8886);

            ds.send(dp);


            byte[] buf2=new byte[1024];

            DatagramPacket dp2=new DatagramPacket(buf2, buf2.length);

            ds.receive(dp2);

            System.out.println("对方IP地址:"+dp2.getAddress()+"  "+"端口:"+dp2.getPort());
            String str=new String(dp2.getData(),0,dp2.getLength());
            System.out.println(str);
            if("bye".equals(str)) {
                break;
            }

        }
        ds.close();

    }

}
  • 写回答

1条回答 默认 最新

  • 毕小宝 博客专家认证 2019-09-06 14:17
    关注

    那是因为你的代码中发送完成后是在当前流程中继续读取响应内容的,如果想继续发送而不受接收的影响可以另起一个线程去收消息:
    而且这里你的结束条件是接收到 bye 后停止循环的。调整代码如下:

    public class Client {
        private static DatagramSocket ds = null;
    
        //通信标识 
        private static volatile boolean isBye = false;
    
        public static void main(String[] args) throws SocketException, IOException {
    
            Scanner scanner=new Scanner(System.in);
            //发数据
            ds=new DatagramSocket(9999);//客户端的端口号是9999
    
            startReceiveThread();
    
            System.out.println("客户端已经启动,开始聊天吧?!");
            while(!isBye) {
    
                String s=scanner.next();
                byte[] buf=s.getBytes();
    
                DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"),8886);
    
                ds.send(dp);
    
            }
            ds.close();
            scanner.close();
        }
    
        public static void startReceiveThread() {
            Runnable receiveTask = ()->{
                while(true) {
                    byte[] buf2=new byte[1024];
                    DatagramPacket dp2=new DatagramPacket(buf2, buf2.length);
                    try {
                        ds.receive(dp2);
                         System.out.println("对方IP地址:"+dp2.getAddress()+"  "+"端口:"+dp2.getPort());
                            String str=new String(dp2.getData(),0,dp2.getLength());
                            System.out.println("Received info:"+str);
                            if("bye".equals(str)) {
                                isBye = true;
                                break;
                            }
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            };
    
            new Thread(receiveTask).start();
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘