<JavaEE> 基于 UDP 的 Socket 通信模型
目录
一、认识相关API
1)DatagramSocket
2)DatagramPacket
3)InetSocketAddress
二、UDP数据报套接字通信模型概述
三、回显客户端-服务器通信
1)服务器代码
2)客户端代码
一、认识相关API
1)DatagramSocket
| DatagramSocket 常用构造方法 | |
| DatagramSocket() | 创建UDP数据报Scoket套接字,绑定本机任意端口(通常用于客户端)。 |
| DatagramSocket(int port) | 创建UDP数据报Scoket套接字,绑定本机指定端口(通常用于服务器)。 |
| DatagramSocket 常用方法 | |
| void receive(DatagramPacket p) | 接收数据报并写入参数p中,没有收到则会阻塞等待。 |
| void send(DatagramPacket p) | 发送数据报。 |
| void close() | 关闭socket套接字。 |
2)DatagramPacket
| DatagramPacket 常用构造方法 | |
| DatagramPacket(byte[] buf, int length) | 构造用于存储数据报的容器,指定字节数组和数组长度。 |
| DatagramPacket(byte[] buf, int length, SocketAddress address) | 构造用于存储数据报的容器,指定字节数组、数组长度、目的地IP地址和端口号。 |
| DatagramPacket 常用方法 | |
| InetAddress getAddress() | 从数据报中获取目的地的IP地址。 |
| int getPort() | 从数据报中获取目的地的端口号。 |
| byte[] getData() | 从数据报中获取字节数据。 |
3)InetSocketAddress
| InetSocketAddress是SocketAddress的子类。 | |
| InetSocketAddress 常用构造方法 | |
| InetSocketAddress(String ip, int port) | 构造Socket地址,包含IP地址和端口号。 |
| InetSocketAddress(InetAddress addr, int port) | 构造Socket地址,包含IP地址和端口号。 |
二、UDP数据报套接字通信模型概述
| UDP协议具有无连接,面向数据报的特征。每次通信,双方都是没有建立连接的,并且一次性发送或接收全部通信内容。 |
| UDP通信,使用DatagramSocket类构建套接字,使用DatagramPacket类构建数据报。 |
| UDP通信流程:客户端构造请求->发出请求->服务器接收请求->解析请求->处理请求->构造响应->返回响应->客户端接收响应->解析响应->处理响应 |
三、回显客户端-服务器通信
1)服务器代码
public class UDP_Echo_Server {private DatagramSocket socket = null;public UDP_Echo_Server(int port) throws SocketException {//作为服务器端,根据指定端口号创建一个数据报连接通道;socket = new DatagramSocket(port);}//调用该方法启动服务器;public void start() throws IOException {System.out.println("服务器启动!");while(true){//新建一个数据报容器,用于存放请求;DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);//接收数据报(请求),如果暂时没有请求,则在这里阻塞等待;socket.receive(requestPacket);//将获得的数据报(请求)转换为字符串;String request = new String(requestPacket.getData(),0, requestPacket.getLength());//通过process方法对请求报进行处理,并形成响应;String response = process(request);//将响应转换为数据报,数据包中已经指定了目的地IP;DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());//将数据报(响应)发送;socket.send(responsePacket);//打印日志;System.out.printf("[%s,%d] req=%s res=%s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);}}private String process(String request) {return request;}public static void main(String[] args) throws IOException {UDP_Echo_Server server = new UDP_Echo_Server(端口号);server.start();}
}
2)客户端代码
public class UDP_Echo_client {private DatagramSocket socket = null;private String serverIP = "";private int serverPort = 0;public UDP_Echo_client(String IP,int Port) throws SocketException {//作为客户端,需要显式知道服务器的IP和端口号;this.serverIP = IP;this.serverPort = Port;//客户端自己的端口号,由系统自行分配即可,根据系统分配的端口号创建一个数据报连接通道;socket = new DatagramSocket();}//调用该方法启动客户端;public void start() throws IOException {System.out.println("客户端启动!");Scanner sc = new Scanner(System.in);while (true){System.out.print("->");String request = sc.next();//将字符串转换为数据报(请求),并在数据报中指定了目的地IP及端口;DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,new InetSocketAddress(serverIP,serverPort));//发送数据报(请求);socket.send(requestPacket);//新建一个数据报容器,用于存放响应;DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);//接收数据报(响应),如果暂时没有响应,则在这里阻塞等待;socket.receive(responsePacket);//将获得的数据报(响应)转换为字符串;String response = new String(responsePacket.getData(),0,responsePacket.getLength());//打印响应;System.out.println(response);}}public static void main(String[] args) throws IOException {UDP_Echo_client client = new UDP_Echo_client(IP地址,端口号);client.start();}
}
阅读指针 -> 《TCP回显服务器》
链接生成中........
相关文章:
<JavaEE> 基于 UDP 的 Socket 通信模型
目录 一、认识相关API 1)DatagramSocket 2)DatagramPacket 3)InetSocketAddress 二、UDP数据报套接字通信模型概述 三、回显客户端-服务器通信 1)服务器代码 2)客户端代码 一、认识相关API 1)Data…...
Golang 链表的基础知识
文章目录 链表链表基础知识部分链表的存储方式链表的定义链表的操作性能分析 链表 更多有关于go链表的内容可以见这篇文章链表的创建和读取 链表基础知识部分 什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,…...
webpack 常见面试题
1、什么是webpack(必会) webpack是一个打包模块化javascript的工具,在webpack里一切文件皆模块,通过loader转换文件,通过plugin注入钩子,最后输出由多个模块组合成的文件,webpack专注构建模块化…...
three.js实战模拟VR全景视图
文章中使用到的案例图片都来源于:Humus - Textures 里面有很多免费的资源,可以直接下载,每个资源里面都提供6个不同方位的图片,我们通过threejs稍微处理一下,就能实现以下3D效果的场景了。 <template><div …...
聊聊Spring Boot配置文件:优先级顺序、bootstrap.yml与application.yml区别详解
Spring Boot 配置文件 优先级顺序 在Spring Boot中,配置文件的优先级顺序是:bootstrap.yml > application.yml > application-{profile}.yml,其中 {profile} 表示不同的环境配置,如 dev、test、prod 等。当存在相同名称的…...
Milvus向量数据库基础用法及注意细节
1、Milvus数据类型与python对应的数据类型 Milvus Python DataType.INT64 numpy.int64 DataType.INT32 numpy.int32 DataType.INT16 numpy.int16 DataType.BOOL Boolean DataType.FLOAT numpy.float32 DataType.DOUBLE numpy.double DataType.ARRAY list DataT…...
虚拟机多开怎么设置不同IP?虚拟机设置独立IP的技巧
随着虚拟化技术的不断发展,虚拟机已经成为了许多人的必备工具。在虚拟机中,我们可以轻松地创建多个虚拟机,并在每个虚拟机中设置不同的IP地址。下面,我们将介绍如何在虚拟机中设置独立IP地址的方法。 一、虚拟机多开设置不同IP的方…...
使用Docker-镜像命令
镜像名称一般分两部分组成:[repository]:[tag] 在没有指定tag时,默认是latest,代表最新版本的镜像 目录 案例一:从DockerHub中拉取一个nginx镜像并查看 1.1. 首先去镜像仓库搜索nginx镜像,比如DockerHub 编辑 1.2.操作拉取n…...
4.3 C++对象模型和this指针
4.3 C对象模型和this指针 4.3.1 成员变量和成员函数分开存储 在C中,类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 #include <iostream>class Person { public:Person() {mA 0;} //非静态成员变量占对象空间int mA;//静态成员变量…...
计算机网络——计算机网络的概述(一)
前言: 面对马上的期末考试,也为了以后找工作,需要掌握更多的知识,而且我们现实生活中也已经离不开计算机,更离不开计算机网络,今天开始我们就对计算机网络的知识进行一个简单的学习与记录。 目录 一、什么…...
基于多反应堆的高并发服务器【C/C++/Reactor】(中)ChannelMap 模块的实现
(三)ChannelMap 模块的实现 这个模块其实就是为Channel来服务的,前面讲了Channel这个结构体里边它封装了文件描述符。假如说我们得到了某一个文件描述符,需要基于这个文件描述符进行它对应的事件处理,那怎么办呢&…...
微信小程序实现一个音乐播放器的功能
微信小程序实现一个音乐播放器的功能 要求代码实现wxml 文件wxss 文件js文件 解析 要求 1.页面包含一个音乐列表,点击列表中的音乐可以播放对应的音乐。 2.播放中的音乐在列表中有标识,并且可以暂停或继续播放。 3.显示当前音乐的播放进度和总时长&#…...
算法基础之表达整数的奇怪方式
表达整数的奇怪方式 中国剩余定理: 求M 所有m之积 然后Mi M / mi x 如下图 满足要求 扩展中国剩余定理 找到x **使得x mod mi ai**成立 对于每两个式子 都可以推出①式 即 用扩展欧几里得算法 可以算出k1,-k2和m2–m1 判无解 : 若**(m2–m1) % d ! 0** 说明该等式无解 …...
WEB 3D技术 three.js 设置图像随窗口大小变化而变化
本文 我们来讲讲我们图层适应窗口变化的效果 可能这样说有点笼统 那么 自适应应该大家更熟悉 就是 当我们窗口发生变化说 做一些界面调整比例 例如 我们这样一个i项目界面 我们打开 F12 明显有一部分被挡住了 那么 我们可以刷新 这样是正常了 但是 我们将F12关掉 给F12的…...
实战案例:缓存不一致问题的解决(redis+本地缓存caffine)
一.问题引入 目前在写项目的时候,在B端查看文章,A端修改文章。为了增加效率,以及防止堆内存溢出,在B端选择本地缓存文章的方案。但是目前出现了A端对文章修改之后,B端读的还是旧数据,出现了缓存不一致的问…...
【开源CDP】市场增长未来的探索,开源CDP带来的技术崛起与变革
数字化趋势之下,数据成了企业竞争的核心资源,不管是公域还是私域,网络俨然成了品牌打响市场的一线战场,然而,在这场数字战役里,许多企业不得不面临一个共同问题:数据零散、分散、平台众多、无法…...
第11章 GUI Page423~424 步骤六 支持文字,使用菜单,对话框输入文字
运行效果: 点击OK,然后再窗口上按住左键,拖动鼠标 关键代码: 新增头文件和成员,新增私有成员_text 成员初始化 为菜单项MenuItemText添加响应函数 新增创建TextItem()的代码...
【Qt】Qt Creator 警告: Unused parameter ‘xxx‘
1. 问题 Qt开发中,有些函数参数没有使用,会报Unused parameter xxx警告,这个警告不影响代码正常运行。 2. 屏蔽这个警告的方法 2.1 方法1 函数中添加 Q_UNUSED(arg); TestClass::TestClass(QObject *parent) {Q_UNUSED(parent); }2.2 方…...
「Vue3面试系列」Vue3.0性能提升主要是通过哪几方面体现的?
文章目录 一、编译阶段diff算法优化静态提升事件监听缓存SSR优化 二、源码体积三、响应式系统参考文献 一、编译阶段 回顾Vue2,我们知道每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发…...
网络结构模式
一、C/S结构 服务器 - 客户机,即 Client - Server ( C/S )结构。 C/S 结构通常采取两层结构。服务器负责数据的 管理,客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器,服务器则是提 供信息供人…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
