netty编程

需要导包:netty-all-4.1.25.Final

或者导入依赖:

    io.netty

    netty-all

    4.1.25.Final

定义一个server类:

public class HelloServer {

public static void main(String[] args) {

    // 定义一对线程组

    // 主线程组, 用于接受客户端的连接,但是不做任何处理,跟老板一样,不做事

    EventLoopGroup bossGroup = new NioEventLoopGroup();

    // 从线程组, 老板线程组会把任务丢给他,让手下线程组去做任务

    EventLoopGroup workerGroup = new NioEventLoopGroup();

    // netty服务器的创建, ServerBootstrap 是一个启动类

    ServerBootstrap serverBootstrap = new ServerBootstrap();

    serverBootstrap.group(bossGroup,workerGroup)  // 设置主从线程组

                            .channel(NioServerSocketChannel.class)  // 设置nio的双向通道

                            .childHandler(new HelloServerInitializer()); // 初始化器,用于处理workerGroup

    try {

    // 启动server,并且设置8088为启动的端口号,同时启动方式为同步

    ChannelFuture channelFuture = serverBootstrap.bind(8088).sync();

    // 监听关闭的channel,设置位同步方式

    channelFuture.channel().closeFuture().sync();

} catch (InterruptedException e) {

    e.printStackTrace();

}finally {

    bossGroup.shutdownGracefully();

    workerGroup.shutdownGracefully();

    }

}

}

初始化器类:

public class HelloServerInitializer extends ChannelInitializer {

@Override

protected void initChannel(SocketChannel ch) throws Exception {

    // 通过SocketChannel去获得对应的管道

    ChannelPipeline pipeline = ch.pipeline();

    // 通过管道,添加handler

    // HttpServerCodec是由netty自己提供的助手类,可以理解为拦截器

    // 当请求到服务端,我们需要做解码,响应到客户端做编码

    pipeline.addLast("HttpServerCodec", new HttpServerCodec());

    // 添加自定义的助手类,返回 "hello netty~" 助手类名字可写可不写

    pipeline.addLast("CustomHandler", new CustomHandler());

}

}

自定义的处理器:

public class CustomHandler extends SimpleChannelInboundHandler{

@Override

protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {

// 获取channel

    Channel channel = ctx.channel();

    if(msg instanceof HttpRequest) {

    // 显示客户端的远程地址

    System.out.println(channel.remoteAddress());

    // 定义发送的数据消息

    ByteBuf content = Unpooled.copiedBuffer("hello netty",CharsetUtil.UTF_8);

    // 构建一个http response

    FullHttpResponse resp = new     DefaultFullHttpResponse(HttpVersion.HTTP_1_1,HttpResponseStatus.OK,content);

    // 为响应增加数据类型和长度

    resp.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain");

    resp.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes());

    ctx.writeAndFlush(resp);

}

}

@Override

public void channelRegistered(ChannelHandlerContext ctx) throws Exception {

    System.out.println("channel。。。注册");

    super.channelRegistered(ctx);

}

@Override

public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {

    System.out.println("channel。。。移除");

    super.channelUnregistered(ctx);

}

@Override

public void channelActive(ChannelHandlerContext ctx) throws Exception {

    System.out.println("channel。。。活跃");

    super.channelActive(ctx);

}

@Override

public void channelInactive(ChannelHandlerContext ctx) throws Exception {

    System.out.println("channel。。。不活跃");

    super.channelInactive(ctx);

}

@Override

public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

    System.out.println("channeld读取完毕。。。");

    super.channelReadComplete(ctx);

}

@Override

public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {

    System.out.println("用户事件触发。。。");

    super.userEventTriggered(ctx, evt);

}

@Override

public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception {

    System.out.println("channel可写更改");

    super.channelWritabilityChanged(ctx);

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

    System.out.println("补货到异常");

    super.exceptionCaught(ctx, cause);

}

@Override

public void handlerAdded(ChannelHandlerContext ctx) throws Exception {

    System.out.println("助手类添加");

    super.handlerAdded(ctx);

}

@Override

public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {

    System.out.println("助手类移除");

    super.handlerRemoved(ctx);

}

}

你可能感兴趣的:(netty编程)