使用 Netty 来开发基于 HTTP 协议的应用是相对常见的场景。HTTP 是一种基于请求-响应模式的应用层协议,用于在客户端和服务器之间传输数据。下面是一个简单的示例,演示了如何使用 Netty 开发一个基于 HTTP 的服务器应用。
首先,确保你已经引入了 Netty 的相关依赖,可以在项目的 pom.xml
文件中添加以下内容:
1 2 3 4 5
| <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.66.Final</version> </dependency>
|
接下来,创建一个简单的 Netty HTTP 服务器应用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; 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.HttpServerCodec; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpServerHandler;
public class HttpServerApp {
public static void main(String[] args) { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup();
try { ServerBootstrap bootstrap = new ServerBootstrap() .group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) { ch.pipeline().addLast(new HttpServerCodec()); ch.pipeline().addLast(new HttpObjectAggregator(65536)); ch.pipeline().addLast(new HttpServerHandler()); } });
ChannelFuture future = bootstrap.bind(8080).sync(); future.channel().closeFuture().sync(); } catch (Exception e) { e.printStackTrace(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } }
|
在上面的示例中,我们创建了一个简单的 HTTP 服务器,监听在本地的 8080 端口。在 initChannel
方法中,我们添加了 HttpServerCodec
(处理 HTTP 编解码)、HttpObjectAggregator
(将 HTTP 消息聚合成 FullHttpRequest 或 FullHttpResponse)和自定义的 HttpServerHandler
(处理 HTTP 请求)。
你需要自己实现一个继承自 ChannelInboundHandlerAdapter
的 HttpServerHandler
类,用于处理接收到的 HTTP 请求。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.HttpUtil; import io.netty.handler.codec.http.HttpVersion;
public class HttpServerHandler extends ChannelInboundHandlerAdapter {
@Override public void channelRead(ChannelHandlerContext ctx, Object msg) { if (msg instanceof FullHttpRequest) { FullHttpRequest request = (FullHttpRequest) msg; String responseContent = "Hello, Netty HTTP Server!"; sendHttpResponse(ctx, request, responseContent); } }
private void sendHttpResponse(ChannelHandlerContext ctx, FullHttpRequest request, String content) { FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); response.content().writeBytes(content.getBytes()); HttpUtil.setContentLength(response, response.content().readableBytes()); ctx.writeAndFlush(response); }
@Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); } }
|
在上面的示例中,HttpServerHandler
类重写了 channelRead
方法,处理接收到的 HTTP 请求。然后,它调用 sendHttpResponse
方法来构建并发送 HTTP 响应。
这只是一个简单的示例,实际的应用可能会更加复杂,需要处理更多的 HTTP 请求类型、处理逻辑以及错误情况。但这个示例可以帮助你入门并理解如何使用 Netty 来开发基于 HTTP 协议的应用。