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.mzph.cn/news/869633.shtml

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

相关文章

vue 导出excel乱码问题

今天做一个导出excel的功能&#xff0c;导出文件显示乱码&#xff0c;分析接口无问题&#xff0c;后修改如下&#xff1a; 1.接口的response类型&#xff1a;类型设置为blob // 导出信息 export const exportInfo (data: any, config { timeout: 6000, responseType: "…

MAT(Eclipse Memory Analyzer) Windows安装

MAT&#xff08;Eclipse Memory Analyzer&#xff09; Windows安装 MAT&#xff08;Eclipse Memory Analyzer&#xff09;是一个Java的内存分析工具 MAT下载地址 安装完成之后的目录机构 如若出现java版本过低的解决办法 在配置文件MemoryAnalyzer.ini中添加指定Java的版本…

PD协议诱骗芯片,XSP08Q,XSP16应用笔记

XSP08Q是3C数码或小家电产品的Type-C接口控制芯片&#xff0c;它负责和PD充电器通讯&#xff0c;获取充电器的快充电压档位&#xff0c;如5V4A&#xff0c;9V3A&#xff0c;12V2A&#xff0c;15V3A&#xff0c;20V5A等等。 XSP08Q支持PD协议&#xff0c;BC1.2协议&#xff0c;Q…

从产业链视角审视工作

从产业链视角审视工作&#xff1a;定位、价值与成长 作为一名技术博客博主&#xff0c;我经常收到各种关于职业发展、技术成长和学习路径的问题。最近&#xff0c;我看了一份学习报告&#xff0c;其中提到了一种非常有趣且实用的视角——从产业链的角度去审视自己的工作。这种视…

Hash算法和MD5容易受到冲突攻击的原因

Hash算法和MD5容易受到冲突攻击的原因主要在于它们的设计缺陷和安全性问题。‌ 设计缺陷&#xff1a;‌如果哈希算法设计不当&#xff0c;‌可能会产生哈希碰撞&#xff0c;‌甚至导致碰撞攻击。‌哈希函数的目标是将输入数据转换成固定长度的输出&#xff0c;‌但如果在设计上…

Web 自动化测试主流框架都有哪些?

Web移动端自动化测试成为了现代软件开发流程中的重要环节&#xff0c;因此&#xff0c;很多主流框架被开发出来来帮助开发人员提高测试效率。本篇文章将从零到一详细介绍Web移动端自动化测试的主流框架。 一、Web移动端自动化测试框架简介 Web移动端自动化测试框架是一种开发工…

百元平价蓝牙耳机哪款好?平价高性价比蓝牙耳机推荐

随着蓝牙耳机的普及&#xff0c;市面上各种品牌的蓝牙耳机也层出不穷。对于那些预算在百元平价的朋友来说&#xff0c;百元平价蓝牙耳机哪款好&#xff1f;这个问题就显得格外重要了。毕竟&#xff0c;蓝牙耳机作为日常生活中不可或缺的小伙伴&#xff0c;不仅需要音质出众、续…

AD3518 SOP-8封装 单节锂电池保护芯片 可替代XB8608/XB8608A

AD3518 是一款内置 MOSFET 的单节锂电池保护芯片。该芯片具有非常低的功耗和非常低阻抗的内置 MOSFET。该芯片有充电过压&#xff0c;充电过流&#xff0c;放电过压&#xff0c;放电过流&#xff0c;过热&#xff0c;短路&#xff0c;电芯反接等各项保护等功能&#xff0c;确保…

7.深度学习概述

深度学习概述 1. 线性回归1.1 线性回归一般表达式1.2 线性回归内积表达方式&#xff1a;1.3 多个样本时&#xff0c;线性回归的进一步表达&#xff1a;1.4 线性回归方程的解析1.5 线性回归就是求loss函数的最小值 2. 如何求函数最小值2.1 一个例子2.2 求导法——求最小值2.3 求…

OCR的基本概念和开源项目介绍

深度学习和OCR OCR基本概念开源项目多模态大模型——OCR free 在当今多模态大模型横行的时代&#xff0c;已经没有人再去研究OCR了 OCR基本概念 OCR是目标检测类项目&#xff0c;但又不完全是目标检测。它是 行级语义OCR问题最有效解决方案&#xff1a;OCR问题&#xff1a; 第…

使用“nvm use 版本号“命令无效

使用"nvm use 版本号"命令无效 为什么无效?解决 为什么无效? 解决 将这个nodejs文件夹删除,然后在运行nvm use 版本号,则 node生效.

C#面:解释startup class的configure方法有什么作用?

这个⽅法来定义整个应⽤如何响应HTTP请求。它有⼏个⽐较重要的参数&#xff0c;application builder&#xff0c;Hosting environment, logo factory&#xff0c; 在这⾥我们可以配置⼀些中间件⽤来处理路径&#xff0c;验证和session等等。 startup class的configure方法是 A…

JSON Server 详细使用教程

简介 JSON Server 是一个非常实用的工具,可以让你快速搭建一个模拟 REST API。它可以基于一个 JSON 文件快速创建一个全功能的假 REST API,非常适合前端开发时做原型或 mock 数据。本文将详细介绍 JSON Server 的安装和使用方法。 安装 JSON Server 是一个 Node.js 模块,可以…

UNIAPP 使用地图 百度 高德 腾讯地图路线轨迹

这里写自定义目录标题 UNIAPP 使用地图 百度 高德 腾讯地图路线轨迹链接: [插件](https://ext.dcloud.net.cn/plugin?id18892/).路线轨迹首先需要申请开发者中心 的key值必须导入插件复制下面代码 替换KEY值申请key值以后 只需要传开始和结束的经度纬度即可** UNIAPP 使用地图…

FastAPI 学习之路(三十四)数据库多表操作

之前我们分享的是基于单个表的数据库表的操作&#xff0c;我们在设计数据库的时候也设计了跨表&#xff0c;我们可以看下数据库的设计 class User(Base):__tablename__ "users"id Column(Integer, primary_keyTrue, indexTrue)email Column(String(10), uniqueTr…

网络基础——udp协议

UDP协议&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是OSI&#xff08;Open System Interconnection&#xff0c;开放式系统互联&#xff09;参考模型中一种无连接的传输层协议&#xff0c;它提供了一种简单的、不可靠的数据传输服务。以下是关于…

《昇思25天学习打卡营第7天 | mindspore 模型训练常见用法》

1. 背景&#xff1a; 使用 mindspore 学习神经网络&#xff0c;打卡第7天&#xff1b; 2. 训练的内容&#xff1a; 使用 mindspore 的模型训练的常见用法&#xff0c;基本上是将前几章节的功能串起来 3. 常见的用法小节&#xff1a; 模型训练的常见流程&#xff0c;如数据…

不想成为失业大军,就要学习六西格玛?

最近&#xff0c;优思学院收到一封邮件&#xff0c;这封邮件的发送者是一位完成了我们六西格玛绿带课程的学生。 他的公司裡有20%的工程师被裁员&#xff0c;但值得注意的是&#xff0c;留下来的工程师中有70%人竟然都持有六西格玛绿带或黑带证书。 他的公司不仅希望利用这些…

el-table封装popver組件,点击列筛选行数据功能,支持筛选,搜索,排序功能

子组件&#xff1a; <template><div class"tableTool" ref"tableTool" click.stop><el-button click"shengFnc">升序</el-button><el-button click"jiangFnc">降序</el-button><el-input v-m…

安卓 APK 安装过程详解

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. 开机后连上网线 2. 查看网线的IP地址 3. 检查ADB连接 4. 修改文件权限 步骤 结语 我的其他博客 前言 在安卓设备上安装…