zoukankan      html  css  js  c++  java
  • UDP方式的传输

    UDP

    我的另一篇文章TCP方式的传输
    部分内容需要查文档学习,我们需要了解下面的两个类:java.net.DatagramSocket和java.net.DatagramPacket

    java.net.DatagramSocket:

    • 此类表示用来发送和接收数据报包的套接字。它就像数据传输过程中的司机或者接站员一样,它指引着数据发送的方向和传输到达的地方
    构造方法:
    • DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。
    • DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。
    常用的方法:
    • send(DatagramPacket p) 从此套接字发送数据报包。
    • receive(DatagramPacket p)从此套接字接收数据报包。
    • close() 关闭此数据报套接字。

    java.net.DatagramPacket:

    • 此类表示数据报包。它就像数据传输中的交通工具,就是它承载着数据在主机之间传输,这个对象将数据打了个包,里面不光封装了数据内容,还有数据的来源,发送数据的主机IP端口等等都一并被封装到了里面。
    构造方法:
    • DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
      构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
    • DatagramPacket(byte[] buf, int length, InetAddress address, int port)
      构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
    • DatagramPacket(byte[] buf, int length)
      构造 DatagramPacket,用来接收长度为 length 的数据包。

    UDP接收端

    先写一个UDP的接收端,大概思路就是,先通过

    DatagramSocket ds = new DatagramSocket(10003);
    

    new一个对象,这个对象用来发送和接收数据包的套接字。然后通过

    DatagramPacket dp = new DatagramPacket(buf, buf.length);
    

    定义数据包,最后调用recieve函数来接收数据,并将数据封装在数据包中。
    值得注意的是发送端的发送至的IP地址及其端口必须和接收端的主机IP以及端口相对应

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UdpRecieve {
        public static void main(String[] args) throws IOException, IOException {
    
            System.out.println("udp  接收端......run");
            /**
             * 定义一个udp的接收端,接收发送过来的数据。并显示在屏幕上
             *
             * 思路:
             *     1、先有udp socket服务,就是先有插座。 而且记住:接收端一定要明确端口,否则,收不到数据
             *     2、接受数据。之前应该先将数据存储到数据包中。因为数据还有解析
             *     3、先定义数据包
             *     4、通过数据包对象获取数据包的内容,发送端的ip、发送端的端口、发送过来的数据
             *     5、关闭资源
             * */
            //1、先有udp socket服务,就是先有插座。而且记住:接收端一定要明确端口,否则,收不到数据
            DatagramSocket ds = new DatagramSocket(10000);
    
            //2、接受数据。之前应该先将数据存储到数据包中。因为数据还有解析
            //3、先定义数据包
            byte[] buf = new byte[1024];    //缓冲区,保存数据
            DatagramPacket dp = new DatagramPacket(buf, buf.length);
            ds.receive(dp);	//阻塞,在接受到数据之前一直处于阻塞状态,类似于输入操作
    
            //4、通过数据包对象获取数据包的内容,发送端的ip、发送端的端口、发送过来的数据
            String ip = dp.getAddress().getHostAddress();
            int port = dp.getPort();
            String text = new String(dp.getData(),0,dp.getLength());
    
            System.out.println(ip+"---:---"+port+"---:---"+text);
            //5、关闭资源
            ds.close();
        }
    }
    
    

    将其装在一个while(true)循环里,可以持续接收数据

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UdpRecieve2 {
        public static void main(String[] args) throws IOException, IOException {
            System.out.println("udp  接收端     run");
            /**
             * 定义一个udp的接收端,接收发送过来的数据。并显示在屏幕上
             *
             * 思路:
             *     1、先有udp socket服务,就是先有插座。 而且记住:接收端一定要明确端口,否则,收不到数据
             *     2、接受数据。之前应该先将数据存储到数据包中。因为数据还有解析
             *     3、先定义数据包
             *     4、通过数据包对象获取数据包的内容,发送端的ip、发送端的端口、发送过来的数据
             *     5、关闭资源
             * */
    
            //1、先有udp  socket服务,就是先有插座嘛。而且记住:接收端一定要明确端口,否则,收不到数据
            DatagramSocket ds = new DatagramSocket(10000);
    
            while(true)
            {
                //2、接受数据。之前应该先将数据存储到数据包中。因为数据还有解析
                //3、先定义数据包
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf, buf.length);
                ds.receive(dp);	//阻塞
    
                //4、通过数据包对象获取数据包的内容,发送端的ip、发送端的端口、发送过来的数据
                String ip = dp.getAddress().getHostAddress();
                int port = dp.getPort();
                String text = new String(dp.getData(),0,dp.getLength());
    
                System.out.println(ip+":"+port+":    "+text);
            }
        }
    }
    

    UDP发送端

    用下面这句先创建一个socket来指引数据的去向,这个里面的参数“8888”表示的不是发送目的地主机的端口,而是发送起点的端口,表示从这个主机的8888端口发出去的。

    DatagramSocket ds = new DatagramSocket(8888);
    

    然后再用下面这句将数据内容,发送的目的地都封装到这么一个数据包里面,里面的参数buf表示字节数组,必须是字节数组,不能是字符串数组,buf.length无疑是传输的长度, InetAddress.getByName("127.255.25.1")是目的地的主机地址,这句的含义是通过ip地址获取主机地址,10000表示目的地接收这个数据的端口,这个端口要保证没有被其他应用占用。

     DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.255.25.1"), 10000);
    

    最后调用send函数即可完成发送

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class UdpSend {
        public static void main(String[] args) throws IOException, IOException {
    
            System.out.println("udp  发送端     run");
    
            /**
             * 通过查阅文档,了解到用于UDP传输协议的对象是DatagramSocket
             *
             * 通过UDP协议发送一段文本数据
             * 思路:
             *     1、需要先建立UDP的socket。它具备发送和接收功能
             *     2、将数据封装到数据包中。数据包对象是DatagramPacket
             *     3、使用socket对象的send方法将数据包发送出去
             *     4、关闭资源
             * */
    
    
            //1、需要先建立UDP的socket。它具备发送和接收功能
            DatagramSocket ds = new DatagramSocket(8888);
    
            //2、将数据封装到数据包中。数据包对象是DatagramPacket
            String text = "hello udp来了!";
            byte[] buf = text.getBytes();	//将数据转成字节数组
            //将字节数组封装到数据包中
            DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.255.25.1"), 10000);
    
            //3、使用socket对象的send方法将数据包发送出去
            ds.send(dp);
    
            //4、关闭资源
            ds.close();
        }
    }
    

    发送键盘输入的数据,这里其实就是加了键盘录入,IO流的操作

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class UdpSend2 {
        public static void main(String[] args) throws IOException, IOException {
    
            System.out.println("udp  发送端     run");
    
            /**
             * 通过查阅文档,了解到用于UDP传输协议的对象是DatagramSocket
             *
             * 通过UDP协议发送一段文本数据 思路: 
             * 1、需要先建立UDP的socket。它具备发送和接收功能
             * 2、将数据封装到数据包中。数据包对象是DatagramPacket 
             * 3、使用socket对象的send方法将数据包发送出去
             * 4、关闭资源
             */
    
            // 1、需要先建立UDP的socket。它具备发送和接收功能
            DatagramSocket ds = new DatagramSocket(9999);
    
            // 2、将数据封装到数据包中。数据包对象是DatagramPacket。数据来自于键盘录入
            BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            while ((line = bufr.readLine()) != null)
            {
                if("over".equals(line))
                    break;
                byte[] buf = line.getBytes(); // 将数据转成字节数组
                // 将字节数组封装到数据包中
                DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.255.25.1"), 10000);
                ds.send(dp);
            }
    
            // 4、关闭资源
            ds.close();
        }
    }
    

    成功示例:

    发送前
    在这里插入图片描述
    从键盘录入发送内容
    在这里插入图片描述
    接收端
    在这里插入图片描述

  • 相关阅读:
    《Java技术》第一次作业
    第十一次作业
    第十次作业
    第九次作业。
    第八次作业
    第七次作业
    第六次作业
    第五次作业。
    《Java技术》第三次作业--面向对象——继承、抽象类、接口
    《Java技术》第二次作业--面向对象基础
  • 原文地址:https://www.cnblogs.com/vfdxvffd/p/11694197.html
Copyright © 2011-2022 走看看