Java使用UDP协议进行通信的基本流程

传输层协议:UDP,非面向连接的协议,只管把数据按照指定的地址发出去。 

一般过程:DatagramSocket和DatagramPacket配合,通过send,reseive,发出接收数据包。

传输过程:

  发送端:

      1、使用DatagramSocket指定端口,创建发货地址。

      2、把要传输的数据打包到字节数组中。

      3、使用DatagramPacket将数据和目的地信息打包:new  DatagramPacket(字节数组,off,length,目标地址,目标端口)

      4、使用DatagramSocket对象的send(DatagramPacket packe)方法将打包好的数据发出。

      5、通过close方法关闭资源。

  接收端:

      1、使用DatagramSocket指定端口,确定收获地址。

      2、准备好一个接受数据的包new DatagramPacket(一个字节数组,off,length)  这个包的大小就是字节数组的大小。

      3、使用DatagramSocket对象的receive(DatagramPacket packet)方法阻塞式接受数据到准备好的包中。

      4、packet.getData()即可获取包内信息。

      5、通过close方法关闭资源。

 

 

 

例子:

实现了在本机上,不同端口之间的通信。

实现接收代码:

public class MyServe {
    private final int localport;

    /**
     * @param localport 接收端使用的端口号
     */
    public MyServe(int localport) {
        this.localport = localport;
    }

    //接收端
    void server() throws IOException {
        // 1.使用DatagramSocket 指定端口  创建接收端
        DatagramSocket server = new DatagramSocket(this.localport);
        //2.准备容器  封装成DatagramPacket包裹
        byte[] container= new byte[1024*60];
        DatagramPacket packet = new DatagramPacket(container,0,container.length);
        while (true) {
            //3.阻塞式接受包裹receive(DatagramPacket  p)
            server.receive(packet);
            // 4.分析数据
            String data = new String(packet.getData(), 0, packet.getLength());
            System.out.println("对面说:" + data);
            if(data.equals("byby")){
                System.out.println("对面离开了聊天室");
                break;
            }
        }
        // 5.释放资源
        server.close();
    }
}
查看代码

实现发送代码:

public class MyClint {
    private final int localport;
    private int destPort;
    private String destAddress;

    /**
     *
     * @param localport 发送端使用的端口号
     * @param destPort  目的地端口号
     * @param destAddress  目的地地址
     */
    public MyClint(int localport, int destPort, String destAddress) {
        this.localport = localport;
        this.destPort = destPort;
        this.destAddress = destAddress;
    }

    //发送端
    void client() throws IOException {
        // 1.使用DatagramSocket 指定端口  创建发送端
        DatagramSocket client = new DatagramSocket(this.localport);
        BufferedReader bd=null;
        bd= new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            // 2.准备数据,转成字节数组
            String data = bd.readLine();
            byte[] datas = data.getBytes();
            // 3.封装成DatagramPacket包裹,指定目的地
            DatagramPacket packet = new DatagramPacket(
                    datas,
                    0,
                    datas.length,
                    new InetSocketAddress(this.destAddress, this.destPort));
            // 4.发送包裹send(DatagramPacket  p)
            client.send(packet);
            if(data.equals("byby")){break;}
        }
        if(bd!=null)  bd.close();
        // 5.释放资源
        client.close();
    }
}
查看代码

用户一:

public class User1 {
    public static void main(String[] args) throws IOException {
        //开启发送端服务
        new Thread(()-> {
            try {
                new MyClint(8787,
                        8888,
                        "localhost").client();
            } catch (IOException e) { e.printStackTrace(); }
        }).start();
        //开启接收端服务
        new Thread(()-> {
            try {
                new MyServe(9999).server();
            } catch (IOException e) { e.printStackTrace(); }
        }).start();
    }
}
查看代码

用户二:

public class User2 {
    public static void main(String[] args) throws IOException {
        //开启发送端服务
        new Thread(()-> {
            try {
                new MyClint(7878,
                        9999,
                        "localhost").client();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
        //开启接收端服务
        new Thread(()-> {
            try {
                new MyServe(8888).server();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
}
查看代码

启动用户一和用户二后,运行结果:

 

posted @ 2022-11-17 18:52  在博客做笔记的路人甲  阅读(335)  评论(0编辑  收藏  举报