HttpServer
public class MyHttpServer {
public static void main(String[] args) {
NioEventLoopGroup bossGroup = new NioEventLoopGroup();
NioEventLoopGroup workGroup = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workGroup).
channel(NioServerSocketChannel.class).
childHandler(new MyChannelInitializer());
ChannelFuture channelFuture = serverBootstrap.bind(8080).sync();
// 监听关闭事件
channelFuture.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
}
}
处理器
Http无状态,每次传输完成即断开
每次浏览器刷新,都是新的Handler、Channel、pipeline
public class MyHttpServerHandler extends SimpleChannelInboundHandler<HttpObject> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
if (msg instanceof HttpRequest){
//Http无状态,每次传输完成即断开
// 每次浏览器刷新,都是新的Channel、pipeline
// 根据uri进行过滤
HttpRequest request = (HttpRequest) msg;
URI uri = new URI(request.uri());
if ("/favicon.ico".equals(uri.getPath())){
System.out.println("浏览器请求了favicon,不做响应");
return;
}
System.out.println("--------------------------");
System.out.println(msg);
System.out.println(ctx.channel().remoteAddress());
// 返回信息
ByteBuf content = Unpooled.copiedBuffer("Hello,World", CharsetUtil.UTF_8);
FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,content);
response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain");
response.headers().set(HttpHeaderNames.CONTENT_LENGTH,content.readableBytes());
ctx.writeAndFlush(response);
}
}
}
Channel初始化
public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast("MyHttpServerCodec",new HttpServerCodec());
ch.pipeline().addLast("MyHttpServerHandler",new MyHttpServerHandler());
}
}