zoukankan      html  css  js  c++  java
  • UDP协议与UDP通信

    1 UDP协议

    UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

    由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

    但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。

    UDP传输数据被限制在64K以内。

    2 UDP通信

    2.1 DatagramPacket

    JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。

    使用该构造方法在创建DatagramPacket对象时,不仅指定了封装数据的字节数组和数据的大小,还指定了数据包的目标IP地址(addr)和端口号(port)。该对象通常用于发送端,因为在发送数据时必须指定接收端的IP地址和端口号,就好像发送货物的集装箱上面必须标明接收人的地址一样。

    DatagramPacket类中的常用方法

    2.2 DatagramSocket

    在程序中需要实现通信只有DatagramPacket数据包也同样不行,为此JDK中提供的一个DatagramSocket类。DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包

    该构造方法既可用于创建接收端的DatagramSocket对象,又可以创建发送端的DatagramSocket对象,在创建接收端的DatagramSocket对象时,必须要指定一个端口号,这样就可以监听指定的端口。

    DatagramSocket类中的常用方法

    2.3 UDP网络程序

    要实现UDP通信需要创建一个发送端程序和一个接收端程序

    UDP完成数据的发送:

    //发送端
    public class UDPSend {
        public static void main(String[] args) throws IOException {
            //接收用户输入的数据
            Scanner sc=new Scanner(System.in);
            String str=sc.nextLine();
            //1.创建数据包对象,封装要发送的数据,接收端的ip,端口号
            byte[] bytes=str.getBytes();
            //创建inetAddress对象封装接收端的地址
            InetAddress inet=InetAddress.getByName("192.168.1.174");
            DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,6000);
            //2.创建DatagramSocket对象,数据包的发送对象
            DatagramSocket ds=new DatagramSocket();
            //3.调用ds的send方法,发送数据包
            ds.send(dp);
            //4.释放资源
            ds.close();
        }
    }

    UDP完成数据的接收:

    //接收端
    public class UDPRecieve {
        public static void main(String[] args) throws IOException {
            //创建数据包传输对象DatagramSocket绑定端口号
            DatagramSocket ds=new DatagramSocket(6000);
            //创建字节数组来接收发过来的数据
            byte[] bytes=new byte[1024];
            //创建数据包对象DatagramPacket
            DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
            //调用数据包传输对象的receive方法来接收数据
            ds.receive(dp);
            //拆包
            //获取数据长度
            int length=dp.getLength();
            //获取ip地址
            String ip=dp.getAddress().getHostAddress();
            //获取端口号
            int port=dp.getPort();
            System.out.println("ip地址为:"+ip+",端口号为:"+port+",发送的内容为:"+new String(bytes,0,length));
            //释放资源
            ds.close();
        }
    }

    运行结果:

    发送端:

    接收端:

  • 相关阅读:
    tech 浅谈 Yield
    Python strip lstrip rstrip使用方法
    Python strip lstrip rstrip使用方
    Python 的学习脚印(1)
    python中列表的赋值
    python的re模块的sub方法
    Python的异常处理机制
    [python] shutil模块
    【ActiveMq】启动amq时遇到java.net.URISyntaxException: Illegal character in hostname at index处理方法
    【sql总结】
  • 原文地址:https://www.cnblogs.com/zzq123/p/10249694.html
Copyright © 2011-2022 走看看