当前位置: 首页 > news >正文

[Spring Boot]Netty-UDP客户端

文章目录

    • 简述
    • Netty-UDP集成
      • pom引入
      • Client
      • Handler
      • 调用
    • 消息发送与接收
      • 在线UDP服务
      • 系统调用

简述

最近在一些场景中需要使用UDP客户端进行,所以开始集成新的东西。本文集成了一个基于netty的SpringBoot的简单的应用场景。

Netty-UDP集成

pom引入

        <!-- netty --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.84.Final</version></dependency>

如果项目本身使用redis,则redis默认会集成,我的项目中默认有netty-4.1.84.Final

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

Client

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioDatagramChannel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;/*** @author fir*/
@Slf4j
@Component
public class LogPushUdpClient implements ApplicationRunner {private final Bootstrap bootstrap;public final NioEventLoopGroup workerGroup;public static Channel channel;@Overridepublic void run(ApplicationArguments args) {start();}public void start() {try {log.info("UDP客户端--启动");channel = bootstrap.bind(1234).sync().channel();channel.closeFuture().await(1000);} catch (InterruptedException e) {log.info("UDP客户端启动失败");}}private LogPushUdpClient() {bootstrap = new Bootstrap();workerGroup = new NioEventLoopGroup();bootstrap.group(workerGroup).channel(NioDatagramChannel.class).option(ChannelOption.SO_BROADCAST, true).handler(new ChannelInitializer<NioDatagramChannel>() {@Overrideprotected void initChannel(NioDatagramChannel ch) {// 获取了通道的管道,管道是一个处理网络事件和操作的处理器链。ChannelPipeline pipeline = ch.pipeline();// 向管道添加了自定义的 LogPushUdpClientHandler 处理器,它将处理网络 I/O 事件和数据pipeline.addLast(new LogPushUdpClientHandler());}});}}

Handler

package com.fir.home.handler.udp;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.socket.DatagramPacket;
import io.netty.util.concurrent.GenericFutureListener;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;import lombok.extern.slf4j.Slf4j;/*** @author fir*/
@Slf4j
public class LogPushUdpClientHandler extends SimpleChannelInboundHandler<DatagramPacket> {public static HashMap<Long, Boolean> treedMap = new HashMap<>();/*** 客户端初次连接时执行的方法** @param ctx 通道处理上下文*/@Overridepublic void channelActive(ChannelHandlerContext ctx) {log.info("客户端通道已就绪!");}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) {final ByteBuf buf = packet.content();int readableBytes = buf.readableBytes();byte[] content = new byte[readableBytes];buf.readBytes(content);String serverMessage = new String(content);log.info("[UDP客户端]接受消息: " + serverMessage);}/*** 向服务器发送消息** @param msg               按规则拼接的消息串* @param inetSocketAddress 目标服务器地址*/public static void sendMessage(final String msg, final InetSocketAddress inetSocketAddress) {log.info("[UDP客户端]发送消息消息: " + msg);if (msg == null) {throw new NullPointerException("[UDP客户端]发送数据为空");}DatagramPacket datagramPacket = datagramPacket(msg, inetSocketAddress);senderInternal(datagramPacket);}/*** 组装数据包** @param msg               消息串* @param inetSocketAddress 服务器地址* @return DatagramPacket*/public static DatagramPacket datagramPacket(String msg, InetSocketAddress inetSocketAddress) {DatagramPacket datagramPacket;ByteBuf dataBuf = Unpooled.copiedBuffer(msg, StandardCharsets.UTF_8);datagramPacket = new DatagramPacket(dataBuf, inetSocketAddress);return datagramPacket;}/*** 发送数据包服务器无返回结果** @param datagramPacket 数据报文包*/private static void senderInternal(final DatagramPacket datagramPacket) {if (LogPushUdpClient.channel != null) {LogPushUdpClient.channel.writeAndFlush(datagramPacket).addListener((GenericFutureListener<ChannelFuture>) future -> {boolean success = future.isSuccess();if (log.isInfoEnabled()) {log.info("[UDP客户端]发送结果 : " + success);}});} else {throw new NullPointerException("UPD上下文通道为空");}}
}

调用

        InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 50000);LogPushUdpClientHandler.sendMessage("hello", inetSocketAddress);

消息发送与接收

在线UDP服务

服务端可以使用在线UDP服务
http://udp.xnkiot.com/

系统调用

调用后,可以看到,数据发送成功,并且接受成功。
image.png
image.png

http://www.lryc.cn/news/380446.html

相关文章:

  • 基础C语言知识串串香11☞宏定义与预处理、函数和函数库
  • Python 3 函数
  • 【Linux详解】冯诺依曼架构 | 操作系统设计 | 斯坦福经典项目Pintos
  • html做一个画热图的软件
  • 软考初级网络管理员__软件单选题
  • 数据库新技术【分布式数据库】
  • 关于运用人工智能帮助自己实现英语能力的有效提升?
  • IPv6知识点整理
  • 数据赋能(127)——体系:数据标准化——概述、关注焦点
  • 【 ARMv8/ARMv9 硬件加速系列 3.5.1 -- SVE 谓词寄存器有多少位?】
  • Python - 调用函数时检查参数的类型是否合规
  • Python基础面试题解答
  • MATLAB直方图中bin中心与bin边界之间的转换
  • Chromium 开发指南2024 Mac篇-开始编译Chromium(五)
  • 2024.06.11校招 实习 内推 面经
  • linux 免密备份文件到另外一台服务器
  • 【html】用html写一个博物馆首页
  • 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【13】压力压测JMeter-性能监控jvisualvm
  • 【python】python海底捞门店营业数据分析与可视化(数据集+源码+论文)【独一无二】
  • 利用机器学习弄懂机器学习!
  • Ubuntu22.04系统安装及配置
  • 抖音多功能全自动引流工具,支持评论关注私信留痕点赞等,让你的抖音粉丝暴涨!
  • day3-xss漏洞(米斯特web渗透测试)
  • HTML中的<iframe>标签及其属性
  • Elastisearch集群(单节点)
  • Vue78-缓存路由组件
  • windows设置开机启动项
  • 【Linux】 yum学习
  • Mac数据如何恢复?3 款最佳 Mac 恢复软件
  • 基于SpringBoot+Vue航空票务管理系统设计和实现(源码+LW+调试文档+讲解等)