美文网首页
Java 25 UDP在Java中的实现

Java 25 UDP在Java中的实现

作者: 第二套广播体操 | 来源:发表于2019-02-12 14:21 被阅读0次

    DatagramSocket 此类表示用于发送和接收数据报数据包的套接字。
    DatagramPacket 该类表示数据报包。


    DatagramSocket


    DatagramSocket构造方法
    DatagramSocket常用方法
    DatagramSocket常用方法

    DatagramPacket 构造方法 确定创建接受 还是发送的数据包


    构造方法
    方法

    建立UDP发送端
    1 建立可以实现UDP传输的socket服务
    2 明确具体发送的数据
    3 通过socket服务将具体的数据发送出去
    4 关闭服务

    public class UDPSend_test {
        public static void main(String[] args) throws IOException {
    //       创建UDP服务
            DatagramSocket ds=new DatagramSocket();
    //        明确数据
            String str="UDP 来了";
    //        发送数据 将数据封装到数据包中
            byte[] buf=str.getBytes();
    //        将数据封装到数据包对象中 数据包会明确目的地址 和端口
    //        构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
            DatagramPacket dp=new DatagramPacket(buf,buf.length,
                    InetAddress.getByName("192.168.1.6"),10000);
    //        将数据包发送
            ds.send(dp);
    //        关闭udp服务
            ds.close();
        }
    }
    

    创建接收端
    创建socket服务 给接收端明确端口
    收数据
    将其中所需要的数据取出来 ip data 端口

    public class UDPRece_test {
        public static void main(String[] args) throws IOException {
            /** 创建接受端
            * 创建socket服务 给接受端明确端口
            * 收数据
            * 将其中所需要的数据取出来 ip data 端口*/
    //        使用socket的接收方法 接收数据
            DatagramSocket ds=new DatagramSocket(10000);
    //        使用socket的接收方法 接收数据 需要将接到的数据存储到数据包中
    //        可以通过数据包对象的方法对收到的数据进行解析
    //        创建数据包
            byte[] bytes=new byte[1024];
            DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
    //        通过数据包的方法解析收到的数据 使用数据包的方法
            ds.receive(dp);
            String ip=dp.getAddress().getHostAddress();
            int port=dp.getPort();
            String s=new String(dp.getData(),0,dp.getLength());
            System.out.println(ip+":"+port+"---"+s);
            ds.close();
        }
    }
    

    实例:
    聊天室

    通过UDP协议
    一个负责发送数据任务 一个负责接收数据任务 两个任务同时执行 需要多线程

    public class UDP_test {
        public static void main(String[] args) throws SocketException {
    //        创建发送端 并明确端口
            DatagramSocket send=new DatagramSocket(10002);
    //        创建接收端 并明确端口
            DatagramSocket rece=new DatagramSocket(10001);
            new Thread(new Send(send)).start();
            new Thread(new Rece(rece)).start();
        }
    }
    //负责发送的任务 通过UDPsocket 发送
    class Send implements Runnable{
        private DatagramSocket ds;
    
        public Send(DatagramSocket ds) {
            this.ds = ds;
        }
        @Override
        public void run() {
    //         1.要发送的数据来自于哪里 键盘
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    //        读取数据
            String line=null;
            while (true)
            {
                try {
                    if (!((line=br.readLine())!=null))break;
                } catch (IOException e) {
                    e.printStackTrace();
                }
    //       2.将数据封装到数据包中
                byte[] bytes=line.getBytes();
                DatagramPacket dp= null;
                try {
    //                明确接收端的ip地址 和端口
                    dp = new DatagramPacket(bytes,bytes.length,
                            InetAddress.getByName("192.168.1.6"),10001);
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
    //        3.数据包发送
                try {
                    ds.send(dp);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if ("over".equals(line)){
                    break;
                }
            }
            ds.close();
        }
    }
    //负责接收的任务
    class Rece implements Runnable{
        private DatagramSocket ds;
    
        public Rece(DatagramSocket ds) {
            this.ds = ds;
        }
        @Override
        public void run(){
            while (true) {
    //        接收的数据要存储到数据包中 而数据包中有字节数组
                byte[] bytes = new byte[1024];
                DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
    //        将收到的数据存储到数据包重
                try {
                    ds.receive(dp);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                String ip = dp.getAddress().getHostAddress();
                String data = new String(bytes, 0, dp.getLength());
                System.out.println(ip + ":" + data);
                if ("over".equals(data)) {
                    System.out.println(ip + "离开聊天室");
                }
            }
            }
    }
    

    相关文章

      网友评论

          本文标题:Java 25 UDP在Java中的实现

          本文链接:https://www.haomeiwen.com/subject/xqfkeqtx.html