作为一个正在Java路上摸爬滚打的小菜鸡,之前在项目中也用过Netty,也因为Netty报名阿里的中间件大赛,但终究功力太浅,最终不了了之,最近工作中又遇到了Netty的小姐妹Mina。此时楼主觉得Netty还是需要潜心深入学习一下。就这样在成为大菜鸡的路上不消停的折腾……
一般在楼主学习一项新技术时,首先得来个”Hello,World”来暖暖场。当然Netty也不例外,这里楼主实现一个echo服务器,那么echo是什么呢?
就是先启动客户端,然后建立一个连接并发送一个或多个消息发送到服务器,其中每相呼应消息返回给客户端。当然,这个应用程序没多大意义。但也可以帮助我们理解Netty,以及学习Netty的模板代码。
一般开源软件在maven仓库里面都可以找到,请移步maven厂库
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.12.Final</version>
</dependency>
Echo的服务端代码实现,下面代码实现的主要逻辑是绑定端口号,启动服务,是Netty中常见的模板代码。
public class EchoServer {
private final int port;
public EchoServer(int port) {
this.port = port;
}
public static void main(String[] args)
throws Exception {
// 服务器监听端口号
int port = 8080;
new EchoServer(port).start();
}
public void start() throws Exception {
// NioEventLoopGroup是处理I/O操作的多线程事件循环
EventLoopGroup group = new NioEventLoopGroup();
try {
// ServerBootstrap是一个用于设置服务器的引导类。
ServerBootstrap b = new ServerBootstrap();
b.group(group)
.channel(NioServerSocketChannel.class) // 使用NioServerSocketChannel类,用于实例化新的通道以接受传入连接
.localAddress(new InetSocketAddress(port)) // 设置服务器监听端口号
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new EchoServerHandler()); // 添加请求处理
}
});
// 绑定到端口和启动服务器
ChannelFuture f = b.bind().sync();
System.out.println(EchoServer.class.getName() +
" started and listening for connections on " + f.channel().localAddress());
f.channel().closeFuture().sync();
} finally {
group.shutdownGracefully().sync();
}
}
}
EchoServerHandler实现代码,这里是使用Netty实现网络操作业务逻辑的主要阵地。在这里覆盖channelRead()事件处理程序方法。每当从客户端接收到新数据时,使用该方法来接收客户端的消息。
@Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
// 覆盖channelRead()事件处理程序方法
ByteBuf in = (ByteBuf) msg;
System.out.println(
"Server received: " + in.toString(CharsetUtil.UTF_8));
ctx.write(in);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx)
throws Exception {
// channelRead()执行完成后,关闭channel连接
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
.addListener(ChannelFutureListener.CLOSE);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx,
Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
客户端代码跟上面的代码大体类似,楼主就不在贴出来了,就当留个小作业吧,感兴趣的小伙伴请自行搞定。
楼主基于Netty开发了应用配置管理平台服务,实现了“为业务提供统一的配置管理服务”,可以做到开箱即用,主要功能有:
感兴趣的小伙伴请移步楼主的Netty实践
虽然楼主经常使用到 Netty,但是很多时候对 Netty 的一些概念还是处于知其然,不知其所以然的状态,因此就萌生了重新捋一遍 Netty 实战,在有余力的情况下撸一下Netty的源码,并坚持写博客记录一下这个过程。由于楼主能力有限,博客中难免有不少错误之处,期望大家的建议,斧正。
作 者:haifeiWu
原文链接:https://cloud.tencent.com/developer/article/1333287
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。