netty
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.
如何使用
关键在编写ServerInitializer和clientInitializer。
在其中会申明调用的handler以及调用的顺序。
在handler中我们会自定义自己的处理逻辑。分别继承SimpleChannelInboundHandler和ChannelOutboundHandlerAdapter 在读入和写出时分别调用不同子类的处理逻辑。每一个连接到来时都对应一个pipeline,互相不影响。
在netty中 ByteBuf 和nio 中ByteBuffer是不同的概念。
当需要写出时,推荐使用堆外内存
pipeline
package demo1;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http2.Http2ChannelDuplexHandler;
/**
* @Author: small_double
* @Date: 2019/10/2 上午11:01
*/
public class TestServerInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline channelPipeline = socketChannel.pipeline();
channelPipeline.addLast("httpServerCodec",new HttpServerCodec());
channelPipeline.addLast("testServerHandler", new TestServerHandler());
}
}Handler
```java
package demo1;
import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.FullHttpMessage; import io.netty.handler.codec.http.FullHttpResponse; import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpObject; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.HttpVersion; import io.netty.util.CharsetUtil;
import java.nio.ByteBuffer; import java.nio.charset.Charset;
/**
@Author: small_double
@Date: 2019/10/4 上午9:19 */ public class TestServerHandler extends SimpleChannelInboundHandler {
@Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject) throws Exception { if (httpObject instanceof HttpRequest) { HttpRequest httpRequest = (HttpRequest) httpObject; String uri = httpRequest.uri(); System.out.println(uri); ByteBuf byteBuf = Unpooled.copiedBuffer("hello world", CharsetUtil.UTF_8); HttpVersion version; HttpResponseStatus status; FullHttpResponse fullHttpResponse = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,byteBuf); fullHttpResponse.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain"); fullHttpResponse.headers().set(HttpHeaderNames.CONTENT_LENGTH,byteBuf.readableBytes()); channelHandlerContext.writeAndFlush(fullHttpResponse); } } }
原理极其源码笔记
Last updated
Was this helpful?