对我来说,Netty 4 似乎没有开箱即用的混合 websocket/本机套接字支持。 我在我的服务器上使用自定义二进制协议,它应该在同一端口上同时支持本机和 websocket。这是我在ServerInitializer
中尝试的内容:
@Override
public void initChannel(SocketChannel ch) {
System.out.println("channel initialized");
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new HttpServerCodec());
pipeline.addLast(new HttpObjectAggregator(65536));
// client decoders cannot be singleton....
pipeline.addLast(new WebSocketDecoder(), new ClientCommandDecoder());
pipeline.addLast(this.webSocketEncoder, this.serverCommandEncoder);
pipeline.addLast(this.roomHandler);
}
WebSocketDecoder
取自示例,但它似乎使用了一个握手器,它只处理FullHttpRequest
,这是强制性的HttpObjectAggregator
。
但是,如果不是 HTTP 请求,则HttpServerCodec
和HttpObjectAggregator
似乎都不会传递输入数据。所以这就是我想知道的:
- 我可以编写给定类的自定义实现并覆盖逻辑以传递输入数据(如果它不是 Web 套接字而是本机(
- 或者我可以以某种方式检测输入数据是否来自 websocket 并转向两个不同的流(一个支持 HTTP,另一个没有(
您需要根据您的输入动态调整管道。
请查看我们的移植统一示例...