项目结构
客户端
package com.nio.support.client;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
public class NettyNioClient {
public void connect(int port, String host)throws Exception{
// 配置服务端的NIO线程组,NioEventLoopGroup是个线程组,包含了一组NIO线程
// 专门用于网路时间的处理,实际上它们就是Reactor线程组
NioEventLoopGroup group = new NioEventLoopGroup();
try {
// 创建ServerBootstrap对象,它是Netty用于启动Nio服务的辅助类启动器
// 目的是降低服务端的开发复杂度
Bootstrap bootstrap = new Bootstrap();
// 于服务端不同channel(NioSocketChannel.class)
/**
* handler,创建匿名内部类,实现initChannel方法,
* 作用是当创建NioSocketChannel成功之后
* 在进行初始化时,将它的channelHandler设置到ChannelPipeline中,
* 用于处理网络IO事件
*/
bootstrap.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024));
socketChanne