【东软实训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);
        }
    }
}
相关推荐
醉颜凉10 分钟前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
阿维的博客日记14 分钟前
java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程
java·jvm
qiyi.sky15 分钟前
JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)
java·前端·笔记·学习·tomcat
lapiii35819 分钟前
图论-代码随想录刷题记录[JAVA]
java·数据结构·算法·图论
RainbowSea22 分钟前
4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明
java·spring·spring cloud
程序员小明z22 分钟前
基于Java的药店管理系统
java·开发语言·spring boot·毕业设计·毕设
爱敲代码的小冰41 分钟前
spring boot 请求
java·spring boot·后端
Lyqfor1 小时前
云原生学习
java·分布式·学习·阿里云·云原生
程序猿麦小七1 小时前
今天给在家介绍一篇基于jsp的旅游网站设计与实现
java·源码·旅游·景区·酒店
张某布响丸辣2 小时前
SQL中的时间类型:深入解析与应用
java·数据库·sql·mysql·oracle