
Netty服务类
创建线程池组:分为 启动Netty服务器:使用 配置通道处理:为每个客户端连接创建一个新的线程,添加必要的数据解码和编码器,确保数据正确传输。 从通道读取数据:使用 解码数据:将字节数据解码为字符串格式。 处理逻辑:检查数据是否包含特定标识符,决定采取相应的处理措施。
发布日期:2021-05-07 22:42:12
浏览次数:21
分类:精选文章
本文共 3920 字,大约阅读时间需要 13 分钟。
Netty服务类实现与接送端开发
1. Netty服务类
1.1 服务端监听
Netty服务类负责接收客户端连接并处理数据。在本实现中,服务端采用了线程池的方式来管理客户端连接,提高了服务器的处理能力。
1.2 服务启动
服务启动流程如下:
bossGroup
和workGroup
,分别负责接收客户端连接和处理数据。ServerBootstrap
配置服务器参数,包括绑定的端口号、协议类型等。1.3 关闭服务
服务关闭时,会优雅地关闭所有线程池组,释放资源,避免潜在的资源泄漏问题。
2. 接送端开发
2.1 接收数据
接收数据的核心逻辑如下:
channelRead0
方法接收数据流。2.2 数据处理
具体数据处理逻辑:
- 如果数据中包含
"CN="
标识符,提取相关参数。 - 调用服务层进行业务处理,返回处理结果。
- 将处理结果反馈给客户端。
2.3 数据发送
数据发送功能主要包括:
- 获取通道信息:通过MAC地址查询对应的通道。
- 发送数据:将数据包装后发送至客户端。
3. 项目启动类
3.1 主程序启动
- 使用Spring Boot启动器创建应用程序。
- 定义主程序类,实现
CommandLineRunner
接口。 - 在
run
方法中启动Netty服务器。
3.2 代码结构
public class DemoApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Override public void run(String... args) { new NettyServerListener().start(); }}
4. 服务类实现
4.1 服务器监听
@Component@Slf4jpublic class NettyServerListener { private static final int port = 8081; private NioEventLoopGroup bossGroup; private NioEventLoopGroup workGroup; public void start() { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast(new ServerHandler()); socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); socketChannel.pipeline().addLast(new StringEncoder()); } }); try { ChannelFuture future = serverBootstrap.bind(port).sync(); log.info("Netty通讯服务启动成功:{}", port); future.channel().closeFuture().sync(); } catch (Exception e) { log.warn("Netty通讯服务启动失败:{}", port); e.printStackTrace(); } finally { try { bossGroup.shutdownGracefully().sync(); workGroup.shutdownGracefully().sync(); } catch (InterruptedException e) { e.printStackTrace(); } } } @PreDestroy public void close() { workGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); }}
4.2 接送端处理
@Component@Slf4jpublic class ServerHandler extends SimpleChannelInboundHandler { private static final MapchannelMap = new ConcurrentHashMap<>(); private static ServerHandler serverHandler; @Autowired private DemoService demoService; public ServerHandler() { } @PostConstruct public void init() { serverHandler = this; serverHandler.demoService = this.demoService; } @Override protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { String request = msg.toString(CharsetUtil.UTF_8); log.info("通讯连接:{}", request); boolean containsCN = request.contains("CN=20"); if (containsCN) { String cn2 = request.split("CN=")[1].split(";", 0)[0]; if ("2011".equals(cn2)) { int code = demoService.insertData(request); ctx.writeAndFlush(Unpooled.copiedBuffer("CN=" + cn2 + ";code=" + code, CharsetUtil.UTF_8)); } } } public static String sendMsg(String mac, String data) { if (StringUtils.isEmpty(channelMap.get(mac))) { return "通道不存在!"; } Channel c = channelMap.get(mac); c.writeAndFlush(Unpooled.copiedBuffer(data, CharsetUtil.UTF_8)); return "消息已发送!"; }}
5. 项目运行
通过上述实现,开发者可以轻松启动一个高效的Netty服务器,接收客户端数据并进行相应的业务处理。系统支持动态管理通道连接,确保服务的稳定性和可靠性。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月04日 08时25分52秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
A Guide to Node.js Logging
2019-03-04
webwxbatchgetcontact一个神奇的接口
2019-03-04
Edge浏览器:你的的内核我的芯
2019-03-04
【考研英语-基础-简单句】简单句的核心变化_谓语情态
2019-03-04
Jetson AGX Xavier硬件自启动
2019-03-04
眼睛跟随鼠标转动的小黄人 html+css+js
2019-03-04
统计字符数
2019-03-04
JS数据类型的判断
2019-03-04
实现一个简易Vue(三)Compiler
2019-03-04
仿小米商城(上)
2019-03-04
【30】kotlin 闭包
2019-03-04
自动安装服务2
2019-03-04
js的各种数据类型判断(in、hasOwnProperty)
2019-03-04
严格模式、混杂模式与怪异模式
2019-03-04
HTML 和 CSS 简单实现注册页面
2019-03-04
(SpringMVC)springMVC.xml 和 web.xml
2019-03-04
(LeetCode)Java 求解搜索旋转排序数组
2019-03-04
DP - Tickets - HDU - 1260
2019-03-04