【东软实训Day4——2023.09.07】Java UDP通信

2023-12-15 18:23:33

一、UDP协议简介(User Datagram Protocol,用户数据报协议)

UDP是传输层的协议,该协议主要为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测。

二、UDP的主要特点:

1. UDP是无连接的

即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。

2. UDP使用尽最大努力交付

即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里边有许多参数)。

3. UDP是面向报文的

发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。

4. UDP没有拥塞控制

因此网络出现的拥塞不会使源主机的发送速率降低。

5. UDP支持一对一、一对多、多对一和多对多的交互通信

6. UDP的首部开销小

只有8个字节,比TCP的20个字节的首部要短。

三、DatagramSocket类

DatagramSocket 类用于表示发送和接收数据报包的套接字。数据报包套接字是包投递服务的发送或接收点。每个在数据报包套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

1. 构造方法

(1)DatagramSocket()
表示创建一个默认的套接字,并绑定到本地地址和一个随机的端口号

(2)DatagramSocket(int port)
表示创建一个默认的套接字,并绑定到本地地址和特定的端口号

(3)DatagramSocket(int port, InetAddress iad)
表示创建一个套接字,绑定到特定的端口号及指定地址

(4)DatagramSocket(SocketAddress sad)
表示创建一个套接字,绑定到特定的套接字地址

2. 基本方法

(1)close()
关闭套接字

(2)recevie(DatagramPacket dp)
接受数据报

(3)send(DatagramPacket dp)
发送数据报

四、DatagramPacket类

java.net 包中的 DatagramPacket 类用来表示数据报包,数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

1. 接受类型

(1)DatagramPacket(byte[] buf, int length)
用来接受长度为length的buf数据(即数据存于字节数组buf中)

2. 发送类型

(1)DatagramPacket(byte[] buf, int length, InetAddress address, int port)
将length长的buf数据发送到指定的地址的端口号处

(2)DatagramPacket(byte[] buf, int length, SocketAddress address)
将length长的buf数据发送到指定的套接字地址处

五、代码实例

先运行接收方,再运行发送方。
SendMessage信息发送端:

public class SendMessage {
    public static void main(String[] args) {
        try {
            // 1.建立套接字
            DatagramSocket ds = new DatagramSocket();

            // 2.创建信息,并且打包
            String info = "原神,启动!";

            // 信息装包 信息内容 信息长度 ip/域名 10086
            DatagramPacket dp = new DatagramPacket(
                    info.getBytes(),
                    info.getBytes().length,
                    InetAddress.getByName("127.0.0.1"),
                    10086
            );
            ds.send(dp); // 使用datagramSocket对象将DatagramPacket对象发送出去
            ds.close(); // 关闭
        } catch (SocketException e) {
            throw new RuntimeException(e);
        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

Recv信息接收端:

public class Recv {
    public static void main(String[] args) {
        try {
            // 1.套接字
            DatagramSocket ds = new DatagramSocket(10086);

            // 2. 创包
            byte[] bytes = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

            // 3.将接受的信息写到包里面
            ds.receive(dp);
            System.out.println(dp);
            for (byte b : bytes) {
                System.out.println(b);
            }
            System.out.println(dp.getData());
            // 4.关闭
            ds.close();
        } catch (SocketException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

文章来源:https://blog.csdn.net/weixin_63776726/article/details/132747679
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。