Netty权威指南读书笔记(四)

netty服务端代码
public class MyServer {
public void bind(int port) {
EventLoopGroup ioGroup = new NioEventLoopGroup(); // 接收客户端发起的向服务端的连接
EventLoopGroup workerGroup = new NioEventLoopGroup();// 接收SocketChannel网络读写
try {
ServerBootStrap b = new ServerBootStrap();
b.group(ioGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.childHandler(new ChannelInitializer<SocketChannel>() { //初始化的内部类实现
@Override
private void initChannel(SocketChannel sc) throws Exception {
         sc.pipeline().addLast(new LineBasedFrameDecoder(1024));
sc.pipeline().addLast(new StringDecoder());
sc.pipeline().addLast(new ChanelHandlerAdapter() { // 服务端core处理器内部类
@Override
public void channelRead(...){...} // 核心方法,处理读取到的信息
public void channelReadComplete(...){...} // 将通过write方法发送到缓冲数组中的消息写入SocketChannel中,channelRead中的write方法只把消息写入到缓冲数组中
public void exceptionCaught(...){...}
解释:LineBasedFrameDecoder一次遍历ByteBuf中的可读字节,判断是否有\n或者\r\n。如果有就以此位置为结束位置,从刻度索引都结束位置区间的字节就组成了一行。它是以换行符为结束标志的解码器。
它同时支持配置单行的最大长度。如果连续读取到最大长度仍然没有发现换行符,就会抛出TooLongFrameException异常,同时忽略掉之前读到的异常码流(防止由于异常码流缺失分隔符导致的内存溢出)
StringDecoder功能简单,只是将接收到的对象转换成字符串。

netty客户端代码

public class MyClientHandler {
public void connect(int port, String host) {
EventLoopGroup group = new NioEventLoopGroup();
try {
BootStrap b = new BootStrap();
b.group(group).
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.handler(new ChannelInitializer<SocketChannel>(){// 初始化
@Override
private void initChannel(SocketChannel sc) throws Exception {

sc.pipeline().addLast(new ChanelHandlerAdapter() { // 客户端core处理器内部类
@Override
public void channelRead(...){...} // 核心方法,处理读取到的信息
public void channelActive(...){...} // TCP链路建立成功后,Netty的NIO线程会调用该方法,该方法会调用flush方法,将请求消息发给服务端(和服务端不同,服务端在ChannelReadComplete中会调用flush,将通过write方法发送到缓冲数组中的消息写入SocketChannel中
public void exceptionCaught(...){...}
})

转自:http://blog.csdn.net/xxcupid/article/details/50492204

猜你喜欢

转载自rd-030.iteye.com/blog/2315642