网络协议——UDP协议

  1. udp简介:

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

特点:消耗资源小,通信效率高,常用于音频、视频和普通数据的传输,视频会议都是用UDP,因为在这种情况下丢失一两个数据包,也不会对接收结果产生太大影响,但是使用UDP传输数据时,由于其面向无连接性,不能保证数据的完整性,因此传输中药数据时不建议使用UDP协议。

  2.java提供的类

    DatagramPacket(集装箱):封装UDP通信中发送和接收的数据,使用时接收端可以只需要接收一个字节数组来存放收到的数据,也可以只接收指定IP和端口的数据,而发送端不但要存放发送数据的字节数组,还需要指定接收端IP地址和端口号。

      构造方法:

    (1)DatagramPacket(byte buf[], int length):只能用于接收端,参数为字节数组和数据大小;

    (2)DatagramPacket(byte buf[], int length, InetAddress address, int port):通常用于发送端,参数为字节数组,数据大小,接收地址和端口号

    (3)DatagramPacket(byte buf[], int offset, int length):用于接收端,参数多了一个offset,表示在将接收到的数据放入buff缓存数组时,从offset位开始放入

    (4)DatagramPacket(byte buf[], int offset, int length, InetAddress address, int port):与(2)相似,主要在于参数新增offset, 表示在将接收到的数据放入buff缓存数组时,从offset位开始放入。

    获取数据的方法:

    (1)  InetAddress getAddress():返回InetAddress 对象,DatagramPacket中的接收地址;

    (2)  getPort():返回int型数据,DatagramPacket中的端口号;

    (3) getData():返回byte数组,内容为发送或接收数据;

    (4)  getLength():发送或接收数据长度,int型数据。

    DatagramSocket(码头):发送和接收DatagramPacket数据包,两者关系如下图:码头和集装箱:  

      

    构造方法:

    (1)DatagramSocket ():创建发送端DatagramSocket对象,在创建时没有指定端口号,所以系统会分配一个没有被其他网络程序所使用的端口号;

    (2)DatagramSocket (int port):创建接收端DatagramSocket对象或者发送端对象,在创建接收端对象时,port代表指定监听的端口;发送端代表发送端端口。

    (3)DatagramSocket (int port,InetAddress address):创建DatagramSocket对象指定端口号和相关IP地址,此情况适用于计算机上有多块网卡的情况,明确

      规定数据通过哪块网卡向外发送和接收哪块网卡的数据。正常情况下,不同网卡会分配不同IP,因此在创建DatagramSocket对象时需要通过指定IP地址来

      确定使用哪块网卡进行通信。

    其他方法

    (1)     void receive (DatagramPacket p):用于将接收到的数据填充到DatagramPacket数据包中,在接收到数据返回前会一直处于阻塞状态,只有当接收到数

       据包时,该方法才会返回。

    (2)     void send(DatagramPacket p):用于发送DatagramPacket数据;

    (3)     void close():关闭当前的Socket,释放资源。

     3.实现例子

    (1)接收端

public class Example02 {
    public static void main(String[] args) throws Exception {
        //创建一个长度为1024的字节数组,用于接收数据
        byte[] buf  = new byte[1024];
        //定义一个DatagramSocket对象,监听端口为8954
        DatagramSocket ds = new DatagramSocket(8954);
        //定义一个DatagramPacket对象,用于接收数据
        DatagramPacket  dp= new DatagramPacket(buf, 1024);
        System.out.println("等待接收数据");
        ds.receive(dp); //等待接收数据,如果没有则会阻塞
        //调用DatagramPacket的方法获得接收到的信息,包括数据内容、长度、发送的IP地址和端口号
        String str= new String(dp.getData(), 0, dp.getLength())+"from "+dp.getAddress()+":"+dp.getPort();
        System.out.println(str);
        ds.close();
        
    }
}                    

 (2)发送端

public class Example03 {
    public static void main(String[] args) throws Exception {
        DatagramSocket ds = new DatagramSocket(3000);
        String ss="hello world"; //要发送的数据
        DatagramPacket dp = new DatagramPacket(ss.getBytes(),ss.length(),InetAddress.getByName("localhost"),8954);
        System.out.println("发送信息");
        ds.send(dp);
        ds.close();
    }
}

 

猜你喜欢

转载自www.cnblogs.com/tlxf-blog/p/10757622.html
今日推荐