一、转发服务

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协议实现消息接收与转发相关推荐

  1. java websocket netty_用SpringBoot集成Netty开发一个基于WebSocket的聊天室

    前言 基于SpringBoot,借助Netty控制长链接,使用WebSocket协议做一个实时的聊天室. 项目效果 项目统一登录路径:http://localhost:8080/chat/netty ...

  2. Netty之UDP协议开发

    文章的开头奉献上代码,方便大家对照学习. UDP协议简介 UDP是用户数据报协议(User Datagrame Protocol,UDP)的简称,主要作用是将网络数据流压缩成数据报的形式,提供面向事务 ...

  3. Springboot集成netty实例

    一.简介 netty是jboss提供的一个java开源框架,netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可用性的网络服务器和客户端程序.也就是说netty是一个基于n ...

  4. springboot集成netty框架(物联网tcp连接,只服务端)

    Maven <dependency><groupId>io.netty</groupId><artifactId>netty-all</artif ...

  5. SpringBoot集成Netty

    一.pom依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</art ...

  6. springboot集成netty实现代理服务器

    说明 使用netty实现代理服务功能,思路是:客户端发送请求,由netty服务端通过端口监听到请求,然后在内部再开启一个netty客户端作为代理去访问真实的服务器,最后由真实的服务器将响应返回给代理, ...

  7. Netty的UDP广播发送与接收

    想要的逻辑是这样的: A向局域网内发送广播消息messageA: B收到了messageA并直接使用既有的session或channel把需要回复的消息write回来就行了. 自己尝试了一下,记载一下 ...

  8. netty系列之:使用UDP协议

    文章目录 简介 UDP协议 String和ByteBuf的转换 构建DatagramPacket 启动客户端和服务器 总结 简介 在之前的系列文章中,我们到了使用netty做聊天服务器,聊天服务器使用 ...

  9. [深入浅出WP8.1(Runtime)]Socket编程之UDP协议

    13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...

最新文章

  1. python las转txt
  2. What is Proguard?
  3. 自定义负载均衡策略:
  4. ConcurrentHashMap的源码分析-数据迁移阶段的实现分析
  5. Oracle数据库的安装和配置
  6. ImageServiceImpl加@Service注解
  7. java学习-BeanUtils给对象的属性赋值
  8. 微软这次开源的是 Windows 计算器
  9. Android软件开发之SharedPreferences
  10. 利用SQL语句查询数据库中具体某个字段的重复行
  11. es文件浏览器怎么用_ES文件浏览器——安卓第一文件管理APP
  12. 使用参比溶液的作用是_电导仪使用步骤
  13. 1,python基础入门
  14. 【边缘计算】移动边缘计算中延迟和能量约束任务卸载的最优拍卖
  15. Groovy 教程-- Groovy 入门
  16. 中国高纯电子级过氧化氢市场供需调研与前景方向分析报告2022年版
  17. 翻译学习 | 混合线性模型的思考
  18. ruby所有版本下载地址
  19. Vue_理解组件化开发
  20. PR/PS/AE/达芬奇免费模板素材网站分享——个人纯分享,没有公众号,没有广告!

热门文章

  1. EfficientDet(EfficientNet+BiFPN)论文超详细解读(翻译+学习笔记+代码实现)
  2. stm8s103k3 周期 捕获_STM8S_库函数_TIM1输入捕获测量信号周期
  3. kubectl常用命令
  4. 物业管理行业重大事项点评:融入基层治理,抬升单盘盈利曲线(20210106).PDF
  5. 电路原理图元器件命名规范
  6. cadence SPB17.4 - CIS数据库字段设计细节
  7. 404页面跳转到其他页面的安全做法
  8. Linux(Centos7)安装tomcat8
  9. 基于STM32F407 TFTP远程升级(局域网)
  10. 金格签章使用时碰到的奇葩问题解决