我有一个带有一个处理程序的简单 netty4 服务器:
public class UploadServer {
private final int port;
public UploadServer(int port) {
this.port = port;
}
public void run() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ServerInitializer());
Channel ch = b.bind(port).sync().channel();
ch.closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
int port;
if (args.length > 0) {
port = Integer.parseInt(args[0]);
} else {
port = 8080;
}
new UploadServer(port).run();
}
private class ServerInitializer extends ChannelInitializer<SocketChannel>{
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast("decoder", new HttpRequestDecoder());
p.addLast("encoder", new HttpResponseEncoder());
p.addLast("handler", new UploadServerHandler());
}
}
和这个处理程序
public class UploadServerHandler extends SimpleChannelInboundHandler<Object> {
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
System.out.println("HEllO");
}
我有两个问题:
- 如果我启动这个项目并在浏览器中转到 localhost:8080,我会看到 在控制台中“你好”两次。
- 我想知道如何在我的 uploadServerHandler 中为不同的 URL 实现映射不同的处理程序
抱歉英语不好
最佳答案
控制台中的两个“Hello”可能与您的浏览器进行两次调用有关,一次调用 index.html,另一个调用 favicon。
您可以使用 curl 或 wget 来避免请求网站图标。
对于 url 映射不同的处理程序,我这样做的方式(虽然不确定这是最好的方法)是我在主处理程序中获取 URI:
String uri = request.getUri();
然后根据我已知的 URI 测试 URI,并相应地重定向到其他处理程序。
关于java - 不同 URL 的 Netty 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24035254/