【东软实训Day04】Java UDP通信

一、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信息发送端:

java 复制代码
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信息接收端:

java 复制代码
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);
        }
    }
}
相关推荐
黄交大彭于晏1 分钟前
发送文件脚本源码版本
java·linux·windows
钮钴禄·爱因斯晨7 分钟前
Java 面向对象进阶之多态:从概念到实践的深度解析
java·开发语言·数据结构
鸽子炖汤7 分钟前
Java中==和equals的区别
java·开发语言·jvm
hstar952726 分钟前
二、即时通讯系统设计经验
java·架构
小智学长 | 嵌入式33 分钟前
SOC-ESP32S3部分:36-适配自己的板卡
单片机·物联网·esp32
风象南1 小时前
SpringBoot的4种死信队列处理方式
java·spring boot·后端
互联网全栈架构2 小时前
遨游Spring AI:第一盘菜Hello World
java·人工智能·后端·spring
优秀的颜3 小时前
计算机基础知识(第五篇)
java·开发语言·分布式
BillKu3 小时前
Java严格模式withResolverStyle解析日期错误及解决方案
java
网安INF3 小时前
ElGamal加密算法:离散对数难题的安全基石
java·网络安全·密码学