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()
}
}
转载请注明原文地址: https://ju.6miu.com/read-34002.html