gpt4 book ai didi

java - Netty - 如何在一台服务器上正确地提供 web 套接字和原始 tcp?

转载 作者:行者123 更新时间:2023-11-30 11:20:51 25 4
gpt4 key购买 nike

我想使用 netty 的单个实例同时为网络套接字 (socketio) 和原始 tcp 连接提供服务。我现在正在做的是在开始时只有一个 RoutingHandler 检查第一个字节,如果它是 '[' ,然后删除 RoutingHandler 并将 tcp 处理程序添加到 channel 管道,否则,添加 web 套接字处理程序。代码如下:

public class RoutingHandler extends SimpleChannelInboundHandler<ByteBuf> {

private final ServerContext context;

public RoutingHandler(final ServerContext context) {

this.context = context;
}

@Override
protected void channelRead0(final ChannelHandlerContext ctx, final ByteBuf in) throws Exception {

if (in.isReadable()) {

ctx.pipeline().remove(this);

final byte firstByte = in.readByte();
in.readerIndex(0);
if (firstByte == 0x5B) {

this.context.routeChannelToTcp(ctx.channel());

} else {
// websocket

this.context.routeChannelToSocketIO(ctx.channel());

}

ctx.pipeline().fireChannelActive();

final byte[] copy = new byte[in.readableBytes()];
in.readBytes(copy);

ctx.pipeline().fireChannelRead(Unpooled.wrappedBuffer(copy));
}

}

}

代码似乎有效,但它似乎不是最好的方法,尤其是我有点通过手动调用 fireChannelActive() 来破解 channel 生命周期,因为添加额外的处理程序不会再次触发 Activity 事件,因此需要一些初始化代码未运行。

我的解决方案有什么问题吗?什么是更好的方法?谢谢

最佳答案

这称为端口统一。有一个很好的例子here ,虽然它演示了 TCP 和 HTTP(使用 SSL 和/或 GZip 检测)之间的切换,而不是 websockets,但原理是相同的。

基本上,您将读取前 5 个字节来嗅探协议(protocol)(或多或少与您所做的一样),并在识别协议(protocol)时相应地修改管道中的处理程序。

由于您无论如何都需要通过 HTTP 启动 websocket,因此如果您按照 this 中所述添加 websocket 升级过程,该示例应该适合您。示例。

关于java - Netty - 如何在一台服务器上正确地提供 web 套接字和原始 tcp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22548963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com