netty udp创建服务端+客户端

一.udp创建服务端

/*** udp 服务器 */
@Slf4j
@Component
public class UdpServer {/*** 创建服务端*/@Asyncpublic void bind(int port) {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(group).channel(NioDatagramChannel.class).option(ChannelOption.SO_BROADCAST, true).option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(65535)).handler(new ChannelInitializer<DatagramChannel>() {@Overridepublic void initChannel(DatagramChannel ch) {ChannelPipeline cp = ch.pipeline();cp.addLast(new ServerHandler(port));}});Channel serverChannel = b.bind(port).sync().channel();log.info("UdpServer start success...");serverChannel.closeFuture().await();} catch (Exception e) {log.error("UdpServer start fall!");} finally {group.shutdownGracefully();}}private class ServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {private int port;// 当前 端口public ServerHandler(int port) {this.port = port;}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {log.error(cause.getMessage());cause.printStackTrace();}/*** 接收消息*/@Overrideprotected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) {// 1.获取数据内容,它是一个ByteBufByteBuf content = packet.content();String request = content.toString(CharsetUtil.UTF_8);// 2.你可以使用ByteBuf的API来读取数据//byte[] bytes = new byte[content.readableBytes()];//content.readBytes(bytes);//String request = new String(bytes, StandardCharsets.UTF_8);InetSocketAddress senderAddress = packet.sender();log.info("{} ---> {}:{}", senderAddress.getAddress().getHostAddress(), this.port, request);}}}

二.udp创建客户端

下面展示一些 有些地方赖得改了,当是记录

@Slf4j
@Component
public class UdpClient {/*** 发送udp,等待对方回复** @param ip* @param port* @param format str,hex* @param msg* @return*/public String sendData(String ip, int port, String format, Object msg) {ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);EventLoopGroup group = new NioEventLoopGroup();Channel channel = null;Response r = new Response();try {InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getByName(ip), port);Bootstrap b = new Bootstrap();b.group(group).channel(NioDatagramChannel.class).handler(new SimpleChannelInboundHandler() {@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {log.error("exceptionCaught ->" + cause.getMessage());cause.printStackTrace();ctx.close();}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {// 处理接收到的数据ByteBuf byteBuf = ((DatagramPacket)msg).content();String response = null;if (format.equals("str")) {response = byteBuf.toString(StandardCharsets.UTF_8);} else {response = ByteBufUtil.hexDump(byteBuf);}log.info("response msg: " + response);r.setMsg(response);ctx.close();}});ChannelFuture future = b.bind(0).sync(); // 绑定端口0以获取随机可用端口channel = future.channel();log.info("{}  <- {}", ip, msg.toString());Channel finalChannel = channel;Future<?> executorServiceFuture = executorService.schedule(() -> {// 检查Channel是否仍然是活动状态if (finalChannel.isActive()) {finalChannel.close();}}, 35, TimeUnit.SECONDS);ByteBuf byteBuf = null;if (format.equals("str")) {byteBuf = Unpooled.copiedBuffer(msg.toString(), CharsetUtil.UTF_8); // 将消息内容转换为ByteBuf} else {byte[] bytes = hexString2Bytes(msg.toString());// 将16进制字符串转换为字节数组byteBuf = Unpooled.wrappedBuffer(bytes); // 使用字节数组创建ByteBuf}DatagramPacket requestPacket = new DatagramPacket(byteBuf, inetSocketAddress);channel.writeAndFlush(requestPacket);// 发送channel.closeFuture().await();//异步等待,通道关闭后会往下执行executorServiceFuture.cancel(true); // 立刻中断return r.getMsg();} catch (Exception e) {e.printStackTrace();return null;} finally {executorService.shutdown(); // 清理资源if (channel != null) channel.close();group.shutdownGracefully();}}/*** 发送udp,不等待回复* @param ip* @param port* @param msg*/public void sendDataNoReply(String ip, int port, Object msg) {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap bootstrap = new Bootstrap();bootstrap.group(group).channel(NioDatagramChannel.class).option(ChannelOption.SO_BROADCAST, true).handler(new SimpleChannelInboundHandler() {@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {// 处理接收到的数据}});Channel channel = bootstrap.bind(0).sync().channel();// 发送数据到指定的地址和端口InetSocketAddress address = new InetSocketAddress(ip, port);ByteBuf buffer = Unpooled.copiedBuffer(msg.toString(), CharsetUtil.UTF_8);DatagramPacket packet = new DatagramPacket(buffer, address);channel.writeAndFlush(packet);// 等待一段时间以确保数据发送完成//Thread.sleep(1000);} catch (InterruptedException e) {log.error("发送udp数据失败:", e);throw new RuntimeException("发送数据失败或连接不上");} finally {group.shutdownGracefully();}}class Response {private String msg;public Response() {}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}}public static byte[] hexString2Bytes(String src) {byte[] bytes = new byte[src.length() / 2];for (int i = 0; i < bytes.length; i++) {int index = i * 2;int j = Integer.parseInt(src.substring(index, index + 2), 16);bytes[i] = (byte) j;}return bytes;}}

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

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

相关文章

latex英文转中文word,及一些latex相关工具分享

前言&#xff1a;想要转换latex生成的英文pdf文件为中文word文件 一、主要步骤 1、文字翻译&#xff1a;直接使用谷歌翻译等辅助将英文翻译成中文即可&#xff1b; 支持英文pdf文件全文翻译&#xff0c;再用迅捷PDF转换器之类的转成word&#xff0c;再手动调整。 https://app…

网络编程:各协议头(数据报格式)

一、mac头 二、ip头 protocol——tcp/udp &#xff08;7&#xff09;TTL——生存时间 三、tcp头 四、udp头

第三课网关作用

实验拓扑图&#xff1a; 基础配置&#xff1a; PC1的基础配置 PC2的基础配置&#xff1a; PC4的基础配置 AR1添加PC4网段: 并且添加pc1,pc2的网段。 并且添加pc1,pc2的网段。 原理&#xff1a;PC4先把数据交给100.100.100.1&#xff0c;交给了路由器&#xff0c;路由器再把数…

ARM学习(29)NXP 双coreMCU IMX1160学习----NorFlash 启动引脚选择

ARM学习&#xff08;28&#xff09;NXP 双coreMCU IMX1160学习----NorFlash 启动引脚选择 1、多种启动方式介绍 IMX1166 支持多组flexSPI 引脚启动&#xff0c;FlexSPI1以及FlexSPI2&#xff0c;通过boot cfg可以切换FlexSPI得实例。 每个实例又支持多组引脚&#xff0c;总共…

《Nature》文章:ChatGPT帮助我学术写作的三种方式

图片翻译 ** 文章内容** 忏悔时间&#xff1a;我使用生成式人工智能&#xff08;AI&#xff09;。尽管在学术界关于聊天机器人是积极力量还是消极力量的争论不休&#xff0c;但我几乎每天都使用这些工具来完善我所写论文中的措辞&#xff0c;并寻求对我被要求评估的工作进行替…

Postman使用教程【项目实战】

目录 引言软件下载及安装项目开发流程1. 创建项目2. 创建集合(理解为&#xff1a;功能模块)3. 设置环境变量&#xff0c;4. 创建请求5. 测试脚本6. 响应分析7. 共享与协作 结语 引言 Postman 是一款功能强大的 API 开发工具&#xff0c;它可以帮助开发者测试、开发和调试 API。…

.NET周刊【7月第1期 2024-07-07】

国内文章 学习.NET 8 MiniApis入门 https://www.cnblogs.com/hejiale010426/p/18280441 MiniApis是ASP.NET Core中的轻量级框架&#xff0c;用最少的代码和配置创建HTTP API。其特点包括简洁明了、性能卓越、灵活多变、易于学习使用&#xff0c;并与ASP.NET Core生态系统完美…

数学建模中常用的数据处理方法

常用的数据处理方法 本文参考 B站西电数模协会的讲解视频 &#xff0c;只作笔记提纲&#xff0c;想要详细学习具体内容请观看 up 的学习视频。国赛的 C 题一般数据量比较大。 这里介绍以下两种方法&#xff1a; 数据预处理方法 数据分析方法 数据预处理方法 1. 数据清洗 为…

伦敦银看盘一般看什么 这3样东西不能缺少

伦敦银看盘&#xff0c;是指伦敦银市场开市之后&#xff0c;投资者打开走势图表&#xff0c;观察盘面行情和盘口信息的过程。一般来说&#xff0c;懂得看盘的人可能会被贴上专业的标签&#xff0c;我们在各种影视作品中看到&#xff0c;那些华尔街的交易员坐在电脑面前&#xf…

LiteOS增加执行自定义源码

开发过程注意事项&#xff1a; 源码工程路径不能太长 源码工程路径不能有中文 一定要关闭360等杀毒软件&#xff0c;否则编译的打包阶段会出错 增加自定义源码的步骤: 1.创建源码目录 2. 创建源文件 新建myhello目录后&#xff0c;再此目录下再新建源文件myhello_demo.c 3. 编…

虚拟机内安装vue-dev-tools

前言 项目开发调试都需要在Citrix在虚拟机环境下&#xff0c;Citrix内连接不到外网&#xff0c;在这边文章&#xff0c;我将介绍自己在Citrix环境内安装 vue-dev-tools的经验 环境 vue 步骤 1. 下载.crx文件 百度网盘里的 .crx文件的 下载链接 2. 加载.crx文件 打开浏览…

02MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本

【ESP32】打造全网最强esp-idf基础教程——16.SmartConfig一键配网

SmartConfig一键配网 一、SmartConfig知识扫盲 在讲STA课程的时候&#xff0c;我们用的是代码里面固定的SSID和密码去连接热点&#xff0c;但实际应用中不可能这么弄&#xff0c;我们得有办法把家里的WiFi SSID和密码输入到设备里面去&#xff0c;对于带屏带输入设备还…

C++报警:warning: zero as null pointer constantstddef.h

源码和警告内容 解决办法&#xff1a; select(0,nullptr,nullptr,nullptr,&delay); 关于NULL和nullptr的区别&#xff1a; 在C中&#xff0c;nullptr和null&#xff08;通常指的是NULL宏&#xff0c;因为C标准中并没有直接定义null关键字&#xff09;都用于表示空指针&am…

JSP入门基础

JSP入门基础 软件开发环境这门课程的复习资料 Web开发技术概述 URL的组成部分 协议、主机DNS名或IP地址和文件名 Tomcat服务器 Tomcat服务器的默认端口号是8080 概念 软件开发环境是围绕着软件开发的一定目标而组织在一起的一组相关软件工具的有机集合 JSP和HTML的区别…

系统数据加密传输的实现

文章目录 1、背景2、需求3、实现思路3.1 密码加密3.2 密码解密3.3 nacos密码加密 4、相关工具类4.1 非对称加密RSA4.2 对称加密AES4.3 Nacos加解密的实现&#xff1a;Jasypt 5、历史数据兼容处理 1、背景 用户在浏览器发送请求数据到后台系统&#xff0c;期间数据在网络传输&a…

Git常见命令和用法

Git 文件状态 Git 文件 2 种状态: 未跟踪:新文件&#xff0c;从未被 Git 管理过已跟踪:Git 已经知道和管理的文件 常用命令 命令作用注意git -v查看 git 版本git init初始化 git 仓库初始化之后有工作区、暂存区(本地库)、版本库git add 文件标识暂存某个文件文件标识以终…

springboot集成tika解析word,pdf,xls文件文本内容

介绍 Apache Tika 是一个开源的内容分析工具包&#xff0c;用于从各种文档格式中提取文本和元数据。它支持多种文档类型&#xff0c;包括但不限于文本文件、HTML、PDF、Microsoft Office 文档、图像文件等。Tika 的主要功能包括内容检测、文本提取和元数据提取。 官网 https…

GRPC使用之ProtoBuf

1. 入门指导 1. 基本定义 Protocol Buffers提供一种跨语言的结构化数据的序列化能力&#xff0c;类似于JSON&#xff0c;不过更小、更快&#xff0c;除此以外它还能用用接口定义(IDL interface define language)&#xff0c;通protoc编译Protocol Buffer定义文件&#xff0c;…

Android14系统应用统一裁剪方案

Android14系统应用统一裁剪方案 背景 当前移除集成到系统里的应用,一般都是根据应用名,到各个mk文件里逐个在PRODUCT_PACKAGES中删除;这种方法,耗时而且不易管理集成到系统里的应用;需要有一个统一管理删除不需要应用的方案。 方案 参考PRODUCT_PACKAGES变量,添加PRO…