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

Netty 示例

1. Netty 示例

1.1. 简单的 Echo 服务器

这里,我们直接使用Netty作为独立的进程启动

1.1.1. Netty 依赖

maven依赖如下:

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

1.1.2. Netty Server

这里我们直接通过Netty监听8080端口,作为服务端启动:

  • EchoServer.java
import com.huawei.athena.netty.handler.EchoServerHandler;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import lombok.extern.slf4j.Slf4j;import java.util.concurrent.atomic.AtomicBoolean;@Slf4j
public class EchoServer {private final int port = 8080;private EventLoopGroup bossGroup;private EventLoopGroup workerGroup;private ChannelFuture serverChannelFuture;private final AtomicBoolean running = new AtomicBoolean(false);public void start() {if (!running.compareAndSet(false, true)) {log.info("the server is running");return;}// 创建事件循环组bossGroup = new NioEventLoopGroup();  // 用于接受连接workerGroup = new NioEventLoopGroup(); // 用于处理连接try {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) // 使用NIO传输通道.option(ChannelOption.SO_BACKLOG, 100).handler(new LoggingHandler(LogLevel.INFO)).childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) {ch.pipeline().addLast(new EchoServerHandler());}}).option(ChannelOption.SO_BACKLOG, 128)          // 服务器套接字选项.childOption(ChannelOption.SO_KEEPALIVE, true); // 客户端套接字选项// 绑定端口并开始接收连接serverChannelFuture = b.bind(port).sync();log.info("Echo服务器启动,监听端口: {}", port);// 等待服务器套接字关闭} catch (InterruptedException e) {log.error("can't start the netty server, ", e);stop();}}public void stop() {if (!running.compareAndSet(true, false)) {log.info("the server is running");return;}log.info("Shutting down Echo server...");// 先关闭服务器通道if (serverChannelFuture != null) {serverChannelFuture.channel().close().awaitUninterruptibly();}// 优雅关闭EventLoopGroupif (workerGroup != null) {workerGroup.shutdownGracefully();}if (bossGroup != null) {bossGroup.shutdownGracefully();}log.info("Echo server shutdown complete");}
}

1.1.3. 服务端回显处理

这里,我们实现了一个简单的业务逻辑,即收到客户端的数据后,不做任何处理,直接原样发送给客户端:

import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;@Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {ctx.write(msg);}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) {ctx.flush();}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();}
}

1.1.4. 主程序

public class NettyApp {public static void main(String [] args) {new EchoServer().start();}
}

1.1.5. 验证

服务端启动进程NettyApp后,我们可以通过telnet命令与服务器交互:

telnet localhost 8008

如果一切正常,当你在控制台上输入字符后,你应该能看到它原样的输出,类似如下打印:

12233445566778899

2. 原理说明

3. 总结

这一章节,我们主要通过ServerBootstrap启动了服务端的应用

http://www.jsqmd.com/news/35113/

相关文章:

  • 2025年电子压力试验生产厂家权威推荐榜单:混凝土压力试验机/纸箱压力试验机/全自动压力试验机源头厂家精选
  • 从网络下载图片到本地
  • Netty 的示例
  • 2025年大型一体化净水器制造企业权威推荐榜单:全自动一体化净水器/自来水一体化净水器/自动一体化净水器源头厂家精选
  • Misc图片题各种解法总结(仅限入门)
  • Perfect Hash能用于分词吗?
  • 小白必看!AI写论文的实用方法全攻略
  • 初中几何①手拉手模型 +两个相似(一般、等腰、等腰直角、60度角、30度角)三角形 或 矩形 的手拉手模型
  • 一对一视频直播app开发,golang fmt格式“占位符” - 云豹科技
  • 2025年立体水幕电影直销厂家权威推荐榜单:3d水幕电影/水幕电影喷泉/水幕电影激光秀源头厂家精选
  • 毕业论文神器:9款免费AI写论文工具全测评,轻松过查重!
  • 与跨域 iframe 通信示例
  • 2025年新疆残膜回收机公司权威推荐榜单:棉花残膜回收机/北疆残膜回收机/残膜收膜打包一体机设备源头厂家精选
  • 实用指南:【Canvas与旗帜】正义联盟之刃
  • 2025年新疆大马力拖拉机公司权威榜单:新疆拖拉机/凯尔3004/大马力农机源头厂商精选
  • 2025年冷风机价格实力厂家权威推荐榜单:移动冷风机/大功率冷风机/节能冷风机源头厂家精选
  • 2025年特殊气体压缩机直销厂家权威推荐榜单:工艺气体螺杆式压缩机/沼气压缩机/化工尾气压缩机源头厂家精选
  • 1v1视频软件源码,php进程之间共享socket资源 - 云豹科技
  • 详细介绍:智能合约在分布式密钥管理系统中的应用
  • 23种设计模式——享元模式(Flyweight Pattern) - 实践
  • 将 Zabbix 的数据导入到 Grafana 中进行可视化
  • zabbix的详细使用教程
  • WAF 在 “纯内网环境 + 内网可上互联网” 场景中的作用分析
  • 网络工程师必备神器
  • react和vue
  • grafana的详细使用教程
  • 十大最佳网络监控工具
  • LaTeX学习笔记:快速上手指南
  • koupleless demo依赖问题
  • 有一种考前背书的美(省选 2026 Edition)