该节主要讲解 Netty 的构成部分。
一、Channel
它代表一个用于连接到实体如硬件设备、文件、网络套接字或程序组件,能够执行一个或多个不同的 I/O 操作的开放连接。可以比作传入和传出数据的传输工具。
二、Callback(回调)
它就是一个方法,提供给另一种方法作为引用,这样后者就可以在某个合适的时间调用前者。比如下面的代码:
1 public class DiscardServerHandler extends ChannelInboundHandlerAdapter { 2 3 /** 4 * 收到数据时调用 5 */ 6 @Override 7 public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 8 // TODO 数据处理 9 }10 }
当服务器收到消息时,会自动调用 ChannelRead 方法,因此我们可以重写该方法来实现对收到数据的处理。
三、Future
它提供了另外一种通知应用操作已经完成的方式。每个 Netty 的出站(outbound) I/O 操作都会返回一个 ChannelFuture ,它允许一个或者多个 ChannelFutureListener 实例,回调方法 operationComplete() 会在操作完成时调用,下面为示例代码:
1 // 启动客户端,客户端用connect连接 2 ChannelFuture f = b.connect(host, port).sync(); 3 f.addListener(new ChannelFutureListener() { 4 public void operationComplete(ChannelFuture future) throws Exception { 5 if(future.isSuccess()) { // 连接成功 6 ByteBuf buf = Unpooled.copiedBuffer("hello", // 写数据 7 Charset.defaultCharset()); 8 ChannelFuture wf = future.channel().writeAndFlush(buf); // 发送数据 9 } else {10 // 打印错误11 Throwable cause = future.cause();12 cause.printStackTrace();13 }14 }15 });
上面的代码首先连接到远程地址,当连接完成时,检查连接状态,若成功发送 hello,否则抛出错误。
四、Event 和 Handler
没看懂,以后补。