springboot集成netty使用udp协议实现消息接收与转发
一、转发服务
1、创建NettyServer,使用线程池实现异步处理
*** udp服务*/
public class NettyServer {private static final Logger LOG = LoggerFactory.getLogger(NettyServer.class);private final AtomicInteger threadNumber = new AtomicInteger(1);ThreadPoolExecutor executor = new ThreadPoolExecutor(0, 10, 60,TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), r -> new Thread(r,"NettyServer-Thread-" + threadNumber.getAndIncrement()));@AutowiredNettyServerHandler nettyServerHandler;public void start(InetSocketAddress address) {try {executor.execute(() -> {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(group).channel(NioDatagramChannel.class)// udp协议.option(ChannelOption.SO_BROADCAST, true).handler(nettyServerHandler);LOG.info("--------------服务端upd服务启动----------------");ChannelFuture channelFuture = b.bind(address.getAddress(),address.getPort()).sync();System.out.println("服务器正在监听消息......");channelFuture.channel().closeFuture().await();} catch (InterruptedException e) {e.printStackTrace();} finally {group.shutdownGracefully();}});} catch (Exception e) {e.printStackTrace();}}
}
2、创建消息处理类NettyServerHandler
/*** 消息接收与转发*/
@Component
public class NettyServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {private static final Logger LOG = LoggerFactory.getLogger(NettyServerHandler.class);@Value("${nettyClient.ip}")private String clientIp;@Value("${nettyClient.port}")private int clientPort;@Overrideprotected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) {ByteBuf byteBuf = msg.content();byte[] bytes = new byte[byteBuf.readableBytes()];byteBuf.readBytes(bytes);byteBuf = Unpooled.copiedBuffer(new String(bytes).getBytes(StandardCharsets.UTF_8));LOG.info("接收到消息:" + new String(bytes));// 将消息转发给客户端ctx.writeAndFlush(new DatagramPacket(byteBuf, new InetSocketAddress(clientIp, clientPort)));}}
3、创建NettyBean用于保存连接上下文
public class NettyBean {/*** 保存连接上下文*/private Map<String, ChannelHandlerContext> channel = new HashMap<>(16);public Map<String, ChannelHandlerContext> getChannel() {return channel;}public void setChannel(String key, ChannelHandlerContext val) {this.channel.put(key, val);}
}
4、配置类NettyConfig
@Configuration
public class NettyConfig {@Value("${nettyServer.ip}")private String serverIp;@Value("${nettyServer.port}")private int serverPort;@Beanpublic NettyBean getNettyBean() {return new NettyBean();}@Beanpublic NettyServer getNettyClient() {NettyServer nettyServer = new NettyServer();nettyServer.start(new InetSocketAddress(serverIp, serverPort));return nettyServer;}
}
5、配置文件
server:port: 10019nettyServer:ip: 127.0.0.1port: 8888nettyClient:ip: 127.0.0.1port: 8889
二、客户端接收
客户端与转发服务同理,与转发服务的区别为无需再次转发消息,而是直接处理。
NettyClient
public class NettyClient {private static final Logger LOG = LoggerFactory.getLogger(NettyClient.class);private final AtomicInteger threadNumber = new AtomicInteger(1);ThreadPoolExecutor executor = new ThreadPoolExecutor(0, 10, 60,TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), r -> new Thread(r,"NettyClient-Thread" + threadNumber.getAndIncrement()));@AutowiredNettyClientHandler nettyClientHandler;public void start(InetSocketAddress address) {try {executor.execute(() -> {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(group).channel(NioDatagramChannel.class).option(ChannelOption.SO_BROADCAST, true).handler(nettyClientHandler);LOG.info("--------------客户端upd服务启动----------------");Channel channel = b.bind(address.getAddress(),address.getPort()).sync().channel();channel.closeFuture().await();} catch (InterruptedException e) {e.printStackTrace();} finally {group.shutdownGracefully();}});} catch (Exception e) {e.printStackTrace();}}
}
NettyClientHandler
@Component
public class NettyClientHandler extends SimpleChannelInboundHandler<DatagramPacket> {@Autowiredprivate NettyBean nettyBean;@Overrideprotected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {System.out.println("客户端收到消息:" + msg.content().toString(StandardCharsets.UTF_8));//保存连接上下文nettyBean.setChannel(msg.sender().getHostName(), ctx);}
}
三、测试
使用测试工具发送消息进行测试
转发服务收到消息并转发到客户端
客户端收到消息
springboot集成netty使用udp协议实现消息接收与转发相关推荐
- java websocket netty_用SpringBoot集成Netty开发一个基于WebSocket的聊天室
前言 基于SpringBoot,借助Netty控制长链接,使用WebSocket协议做一个实时的聊天室. 项目效果 项目统一登录路径:http://localhost:8080/chat/netty ...
- Netty之UDP协议开发
文章的开头奉献上代码,方便大家对照学习. UDP协议简介 UDP是用户数据报协议(User Datagrame Protocol,UDP)的简称,主要作用是将网络数据流压缩成数据报的形式,提供面向事务 ...
- Springboot集成netty实例
一.简介 netty是jboss提供的一个java开源框架,netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可用性的网络服务器和客户端程序.也就是说netty是一个基于n ...
- springboot集成netty框架(物联网tcp连接,只服务端)
Maven <dependency><groupId>io.netty</groupId><artifactId>netty-all</artif ...
- SpringBoot集成Netty
一.pom依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</art ...
- springboot集成netty实现代理服务器
说明 使用netty实现代理服务功能,思路是:客户端发送请求,由netty服务端通过端口监听到请求,然后在内部再开启一个netty客户端作为代理去访问真实的服务器,最后由真实的服务器将响应返回给代理, ...
- Netty的UDP广播发送与接收
想要的逻辑是这样的: A向局域网内发送广播消息messageA: B收到了messageA并直接使用既有的session或channel把需要回复的消息write回来就行了. 自己尝试了一下,记载一下 ...
- netty系列之:使用UDP协议
文章目录 简介 UDP协议 String和ByteBuf的转换 构建DatagramPacket 启动客户端和服务器 总结 简介 在之前的系列文章中,我们到了使用netty做聊天服务器,聊天服务器使用 ...
- [深入浅出WP8.1(Runtime)]Socket编程之UDP协议
13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...
最新文章
- python las转txt
- What is Proguard?
- 自定义负载均衡策略:
- ConcurrentHashMap的源码分析-数据迁移阶段的实现分析
- Oracle数据库的安装和配置
- ImageServiceImpl加@Service注解
- java学习-BeanUtils给对象的属性赋值
- 微软这次开源的是 Windows 计算器
- Android软件开发之SharedPreferences
- 利用SQL语句查询数据库中具体某个字段的重复行
- es文件浏览器怎么用_ES文件浏览器——安卓第一文件管理APP
- 使用参比溶液的作用是_电导仪使用步骤
- 1,python基础入门
- 【边缘计算】移动边缘计算中延迟和能量约束任务卸载的最优拍卖
- Groovy 教程-- Groovy 入门
- 中国高纯电子级过氧化氢市场供需调研与前景方向分析报告2022年版
- 翻译学习 | 混合线性模型的思考
- ruby所有版本下载地址
- Vue_理解组件化开发
- PR/PS/AE/达芬奇免费模板素材网站分享——个人纯分享,没有公众号,没有广告!
热门文章
- EfficientDet(EfficientNet+BiFPN)论文超详细解读(翻译+学习笔记+代码实现)
- stm8s103k3 周期 捕获_STM8S_库函数_TIM1输入捕获测量信号周期
- kubectl常用命令
- 物业管理行业重大事项点评:融入基层治理,抬升单盘盈利曲线(20210106).PDF
- 电路原理图元器件命名规范
- cadence SPB17.4 - CIS数据库字段设计细节
- 404页面跳转到其他页面的安全做法
- Linux(Centos7)安装tomcat8
- 基于STM32F407 TFTP远程升级(局域网)
- 金格签章使用时碰到的奇葩问题解决