【东软实训Day04】Java UDP通信

news/2024/5/18 15:59:40 标签: 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);
        }
    }
}

http://www.niftyadmin.cn/n/5012847.html

相关文章

nvm 在 Windows 上的使用

NVM(Node Version Manager)是一个用于管理和切换多个 Node.js 版本的工具。它允许你在同一台机器上同时安装和使用不同版本的 Node.js,而无需手动安装和卸载。 之前都是只安装一个版本的 node.js,该更新时更新,使得以前…

css中只使用vue的变量

参考&#xff1a;https://blog.csdn.net/FellAsleep/article/details/130617163 1、必须作用在用一个div上 2、变量必须有双横杠“–” <spanclass"bb" :style"spanStyle">11</span>data() {return {spanStyle: {"--color": #bfa /…

openeuler上安装polarismesh集群

1、安装MySQL数据库 数据库连接地址10.10.10.168 用户root 密码123456 2、安装Redis集群 3、初始化SQL unzip polaris-server-release_v1.17.4.linux.amd64.zip mv polaris-server-release_v1.17.4.linux.amd64 polaris-server cd polaris-server mysql -u root -p Enter pas…

密室逃脱小游戏

欢迎来到程序小院 密室逃脱 玩法&#xff1a; 判断可生存的空间&#xff0c;鼠标点击屏幕进行人物左右移动&#xff0c;躲避闸道进行生存&#xff0c;每进行一次关卡都会有分数统计&#xff0c;赶紧去闯关吧^^。开始游戏https://www.ormcc.com/play/gameStart/176 html <c…

软件测试/测试开发丨ChatGPT:带你进入智能对话的新时代

简介 人工智能时代来临 我们正处于AI的iPhone时刻。——黄仁勋&#xff08;英伟达CEO&#xff09; ChatGPT 好得有点可怕了&#xff0c;我们距离危险的强人工智能不远了。——马斯克&#xff08;Tesla/SpaceX/Twitter CEO&#xff09; 以上的内容说明我们现在正处于一个技术大…

将 Qt Designer 的 ui 文件转换为 PySide2 使用的.py 文件

20201206 修订&#xff1a;在 Pyside2 的 5.15.2 版本中&#xff0c;从 ui 生成 py 文件过程&#xff0c;命令从 “uic” 变为 “pyside2-uic” Qt Designer 设计的 ui 文件&#xff0c;就是一个 xml 文件&#xff0c;通过 pyside-uic 可以转换成标准的.py 文件 。通过 QtDesi…

git 远程多分支,本地如何切换分支

1、git clone url 先clone 项目&#xff0c;git branch -a 查看所有分支&#xff0c;发现有多个远程分支 2、假如想在 remote 分支工作&#xff0c;但是本地还没有 remote 分支&#xff0c;可以先输入命令&#xff1a; git checkout &#xff0c;不要按回车键&#xff0c;按…

运行报错(二)cat: write error: Broken pipe

报错现象 运行一些脚本&#xff0c;其中包含 cat 与 grep 流水线化的命令&#xff0c;例如: cat file.txt | grep "pattern"报错&#xff1a;cat: write error: Broken pipe 报错原因 原因是管道在cat还有一些数据要读取时被grep关闭了。信号 SIGPIPE 被 cat 捕获…