<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回显服务器》

​​​​​​​链接生成中........

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023.12.21 关于 Redis 常用数据结构 和 单线程模型

目录 各数据结构具体编码方式 查看 key 对应 value 的编码方式 Reids 单线程模型 经典面试题 IO 多路复用 Redis 常用数据结构 Redis 中所有的 key 均为 String 类型,而不同的是 value 的数据类型却有很多种以下介绍 5 种 value 常见的数据类型 注意&#xff1…

计算机网络概述(下)——“计算机网络”

各位CSDN的uu们你们好呀,今天继续计算机网络概述的学习,下面,让我们一起进入计算机网络概述的世界吧!!! 计算机网络体系结构 数据传输流程 计算机网络性能指标 计算机网络体系结构 两个计算机系统必须高度…

7.4组合总和(LC39-M)

算法: 组合问题,用回溯。 画树 回溯三部曲: 1.确定函数返回值和参数: 返回值:void 参数: candidates, target(题目中给出的) sum:统计每个组合的和,是否target …

5G NTN:通信新天地,卫星通信的奇妙探索

导言: 嗨,大家好!今天我们要深入了解一项让通信更强大的技术——5G NTN。它和卫星通信结合在一起,为我们带来了通信的新时代。在这篇文章中,我们将用白话文揭示5G NTN和卫星通信的关系,探索这个通信世界的奇…

鞋服用户运营策略如何实现有效闭环?

实现长期价值和业务闭环是企业经营的关键。对于鞋服行业来说,如何基于客户旅程编排(Customer Journey Orchestration,简称 CJO)实现用户运营策略的有效闭环,提升长期价值呢? 本文围绕该主题,从鞋…

Ai 会替代人类工作吗?

目录 一、分析 二、一些案例 三、总结 一、分析 人工智能(AI)的发展和应用正在改变我们的生活和工作方式。在某些领域,AI已经显示出了强大的能力和潜力,可以比人类更快、更准确地完成任务。然而,是否会完全取代人类…

Golang leetcode59 螺旋矩阵

螺旋矩阵 leetcode59 初次尝试&#xff0c;从中心向外 func main() {n : 3fmt.Println(generateMatrix(n)) }// 初版&#xff0c;我们从中心点开始 func generateMatrix(n int) [][]int {//1.nXn矩阵table : make([][]int, n)for i : 0; i < n; i {table[i] make([]int, …

C语言——小细节和小知识6

一、转义字符相关 \ 反斜杠&#xff0c;转义字符中的转义序列符 \? 将?转义&#xff0c;防止他被识别成三字母词(很早的东西)中的问号 //三字母词 //??(是[ //??)是] printf("%s","??(??)"); //打印结果是[] 二、fopen函数fc…

Vue2+Vue3组件间通信方式汇总(2)------$emit

组件间通信方式是前端必不可少的知识点&#xff0c;前端开发经常会遇到组件间通信的情况&#xff0c;而且也是前端开发面试常问的知识点之一。接下来开始组件间通信方式第二弹------$emit,并讲讲分别在Vue2、Vue3中的表现。 Vue2Vue3组件间通信方式汇总&#xff08;1&#xff0…

【C++】STL 容器 - stack 堆栈容器 ① ( stack 堆栈容器特点 | stack 堆栈容器与 deque 双端数组容器对比 | 简单示例 )

文章目录 一、 stack 堆栈容器简介1、stack 堆栈容器引入2、stack 堆栈容器特点3、stack 堆栈容器与 deque 双端数组容器对比 二、 代码示例 - stack 堆栈容器简单示例1、代码示例2、执行结果 一、 stack 堆栈容器简介 1、stack 堆栈容器引入 C 语言中的 STL 标准模板库 中的 s…

ABS210-ASEMI手机适配器整流桥ABS210

编辑&#xff1a;ll ABS210-ASEMI手机适配器整流桥ABS210 型号&#xff1a;ABS210 品牌&#xff1a;ASEMI 封装&#xff1a;ABS-4 特性&#xff1a;贴片、整流桥 最大平均正向电流&#xff1a;2A 最大重复峰值反向电压&#xff1a;1000V 恢复时间&#xff1a;&#xff…

步兵 cocos2dx 加密和混淆

文章目录 摘要引言正文代码加密具体步骤代码加密具体步骤测试和配置阶段IPA 重签名操作步骤 总结参考资料 摘要 本篇博客介绍了针对 iOS 应用中的 Lua 代码进行加密和混淆的相关技术。通过对 Lua 代码进行加密处理&#xff0c;可以确保应用代码的安全性&#xff0c;同时提高性…

paddle 54 从PaddleClas2.5初始化模型用于迁移学习(LeViT、ReXNet、EfficientNet等)

随着PaddleClas版本代码的迭代,博主以前的一些代码在使用上出现了bug,导致无法初始化模型,具体涉及paddle 42 将任意paddleclas模型作为paddledetection中的backbone使用代码的使用,为此重新对最新的PaddleClas代码进行梳理,实现重新初始化PaddleClas中的模型。 在迁移学…

Xcode15 iOS 17 Simulator 离线安装,模拟器安装

Xcode 15 安装包的大小相比之前更小&#xff0c;因为除了 macOS 的 Components&#xff0c;其他都需要动态下载安装&#xff0c;否则提示 iOS 17 Simulator Not Installed。 如果不安装对应的运行模拟库 无法真机和模拟器运行&#xff0c;更无法新建项目。但是由于模拟器安装包…

Jenkins 插件管理指南

目录 常用插件 插件安装 已安装插件 installed plugins 常用插件 Docker Plugin&#xff1a; 这个插件让Jenkins能够与Docker容器平台进行集成。它允许在Jenkins构建过程中创建、管理和销毁Docker容器&#xff0c;为需要Docker化的项目提供了极大的便利性。对于需要在容器中…

C语言—每日选择题—Day54

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 存在int类型变量x&#xff0c;y&#xff0c;z&#xff0c;其对应值为x0x59&#xff0c;y0x39&#xff0c;z0x6E&#xff0c;则x * y z的值…

反序列化漏洞原理、成因、危害、攻击、防护、修复方法

反序列化漏洞是一种安全漏洞&#xff0c;它允许攻击者将恶意代码注入到应用程序中。这种漏洞通常发生在应用程序从不安全的来源反序列化数据时。当应用程序反序列化数据时&#xff0c;它将数据从一种格式&#xff08;例如JSON或XML&#xff09;转换为另一种格式&#xff08;例如…

Redis原理

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

广州华锐互动:VR元宇宙技术为汽车行业带来革命性变化

随着科技的飞速发展&#xff0c;VR元宇宙技术已经深入影响到我们生活的方方面面&#xff0c;汽车行业更是深受其益。这一新兴技术的出现&#xff0c;为汽车行业带来了前所未有的变化。广州华锐互动将VR技术应用于汽车行业&#xff0c;研发了VR汽修培训、3D汽车展厅、特种车辆3D…

Redis的五种存储类型以及常用的用途

String 存储session、token&#xff0c;地址信息&#xff0c;分布式锁的实现 list 列表 set 共同关注、共同好友 Hsah 购物车信息 zset 排行榜