HttpServer
import org.apache.log4j.Logger
import io.netty.bootstrap.ServerBootstrap
import io.netty.channel.ChannelFuture
import io.netty.channel.ChannelInitializer
import io.netty.channel.ChannelOption
import io.netty.channel.EventLoopGroup
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.SocketChannel
import io.netty.channel.socket.nio.NioServerSocketChannel
import io.netty.handler.codec.http.HttpRequestDecoder
import io.netty.handler.codec.http.HttpResponseEncoder
public class HttpServer {
private static Logger log = Logger.getLogger(HttpServer.class)
public void start(int port) throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup()
EventLoopGroup workerGroup = new NioEventLoopGroup()
try {
ServerBootstrap b = new ServerBootstrap()
b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
// server端发送的是httpResponse,所以要使用HttpResponseEncoder进行编码
ch.pipeline().addLast(new HttpResponseEncoder())
// server端接收到的是httpRequest,所以要使用HttpRequestDecoder进行解码
ch.pipeline().addLast(new HttpRequestDecoder())
ch.pipeline().addLast(new HttpServerInboundHandler())
}
}).option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true)
ChannelFuture f = b.bind(port).sync()
f.channel().closeFuture().sync()
} finally {
workerGroup.shutdownGracefully()
bossGroup.shutdownGracefully()
}
}
public static void main(String[] args) throws Exception {
HttpServer server = new HttpServer()
log.info("Http Server listening on 8844 ...")
server.start(8844)
}
}
HttpServerInboundHandler
import static io.netty.handler.codec.http.HttpHeaders.Names.CONNECTION
import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_LENGTH
import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE
import static io.netty.handler.codec.http.HttpResponseStatus.OK
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1
import org.apache.log4j.Logger
import io.netty.buffer.ByteBuf
import io.netty.buffer.Unpooled
import io.netty.channel.ChannelHandlerContext
import io.netty.channel.ChannelInboundHandlerAdapter
import io.netty.handler.codec.http.DefaultFullHttpResponse
import io.netty.handler.codec.http.FullHttpResponse
import io.netty.handler.codec.http.HttpContent
import io.netty.handler.codec.http.HttpHeaders
import io.netty.handler.codec.http.HttpHeaders.Values
import io.netty.handler.codec.http.HttpRequest
@SuppressWarnings("deprecation")
public class HttpServerInboundHandler extends ChannelInboundHandlerAdapter {
private static Logger log = Logger.getLogger(HttpServerInboundHandler.class)
private HttpRequest request
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof HttpRequest) {
request = (HttpRequest) msg
String uri = request.getUri()
System.out.println("Uri:" + uri)
}
if (msg instanceof HttpContent) {
HttpContent content = (HttpContent) msg
ByteBuf buf = content.content()
System.out.println(buf.toString(io.netty.util.CharsetUtil.UTF_8))
buf.release()
String res = "Hello World"
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1,OK, Unpooled.wrappedBuffer(res.getBytes("UTF-8")))
response.headers().set(CONTENT_TYPE, "text/plain")
response.headers().set(CONTENT_LENGTH,response.content().readableBytes())
if (HttpHeaders.isKeepAlive(request)) {
response.headers().set(CONNECTION, Values.KEEP_ALIVE)
}
ctx.write(response)
ctx.flush()
}
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.flush()
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
log.error(cause.getMessage())
ctx.close()
}
}