netty 中创建服务流程
- 自定义Handler继承ChannelInboundHandlerAdapter 标记该类@ChannelHandler.Sharable (channel共享)
重写channelRead方法
/**
* 当前的 Channel 已从对等方读取消息时调用。
* @param ctx
* @param msg
* @throws Exception
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf byteBuf = (ByteBuf) msg;
System.out.println("Echo server send :" + byteBuf.toString(Charset.defaultCharset()));
ctx.write(byteBuf);
}
重写 channelReadComplete 方法
/**
* 读完成后 调用
* @param ctx
* @throws Exception
*/
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
}
重写 exceptionCaught 方法
/**
* 异常是调用
* @param ctx
* @param cause
* @throws Exception
*/
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
2.创建 EventLoopGroup
4.创建 ServerBootstrap
5.指定使用 NIO 的传输 Channel
6.设置 socket 地址使用所选的端口
7.添加 EchoServerHandler 到 Channel 的 ChannelPipeline
8.绑定的服务器;sync 等待服务器关闭
9.关闭 channel 和 块, 直到它被关闭
10.关闭 EventLoopGroup, 释放所有资源
public void start() throws Exception {
NioEventLoopGroup group = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(group)
.channel(NioServerSocketChannel.class)
.localAddress(port)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new EchoServerHandler());
}
});
ChannelFuture future = bootstrap.bind().sync();
System.out.println(this.getClass().getName() + " started and listen on " +
future.channel().localAddress());
future.channel().closeFuture().sync();
} finally {
group.shutdownGracefully().sync();
}
}
- Netty核心组件
Bootstrap 和 ServerBootstrap
Channel
ChannelHandler
ChannelPipeline
EventLoop
ChannelFuture
channel中的方法
方法名称 | 描述 |
---|---|
eventLoop() | 返回分配给Channel的EventLoop |
pipeline() | 返回分配给Channel的ChannelPipeline |
isActive() | 返回Channel是否激活, 已激活说明与远程连接对等 |
localAddress() | 返回已绑定的本地SocketAddress |
remoteAddress() | 返回已绑定的远程SocketAddress |
write() | 写数据到远程客户端, 数据通过ChannelPipeline传输过去 |
flush() | 刷新先前的数据 |
writeAndFlush(…) | 一个方便的方法用户调用write(…)而后调用 flush() |