结合WebSocket在Netty中实现ChannelOutboutHandler

结合WebSocket在Netty中实现ChannelOutboutHandler,netty,Netty,我正在使用Netty 4.0.19,并尝试在Netty客户端充当客户端应用程序和服务器应用程序之间的代理的情况下实现ChannelOutboudHandler。它看起来是这样的 --web套接字-->Netty-Client>--[Netty-pipeline]--[out-bound handler 1]--> 客户端应用程序和服务器应用程序之间有两条初始消息进行通信,这需要两种类型的ChannelOutboundHandler。 位于客户端和服务器应用程序之间的Netty客户端负责 检测所交

我正在使用Netty 4.0.19,并尝试在Netty客户端充当客户端应用程序和服务器应用程序之间的代理的情况下实现ChannelOutboudHandler。它看起来是这样的

--web套接字-->Netty-Client>--[Netty-pipeline]--[out-bound handler 1]-->

客户端应用程序和服务器应用程序之间有两条初始消息进行通信,这需要两种类型的ChannelOutboundHandler。 位于客户端和服务器应用程序之间的Netty客户端负责 检测所交换消息的有效性和权限。因此,它读取正在传递的消息并对消息内容执行检查,一旦验证,它将在客户端和服务器应用程序之间建立中继通信

第一个出站处理程序(有趣的部分)如下所示:

@Override
public void write(final ChannelHandlerContext ctx,
        final Object msg,
        final ChannelPromise promise)
          throws Exception {
   try {
    buff = (ByteBuf) msg;
       buff.order(ByteOrder.LITTLE_ENDIAN);

       // TODO add the logic for readable bytes

       ByteBuf helloBuff = null;
        try {
            helloBuff = buff.readBytes(Msg.SIZE).order(ByteOrder.LITTLE_ENDIAN);
            Msg msg = new Msg(helloBuff);

        } catch (Exception e) {
            buff.release();
            if (helloBuff != null) {
                helloBuff.release();
            }

            log.error("Error while converting to a hello msg", e);
            return;
        }

        ctx.writeAndFlush(helloBuff, promise)
                .addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE)
                .addListener(new ChannelFutureListener() {
                    @Override
                    public void operationComplete(ChannelFuture future) {
                        if (future.isSuccess()) {
                            ctx.channel().flush();
                        } else {
                            future.channel().close();
                        }
                    }
                });

       final ChannelPipeline p = ctx.pipeline();
       p.replace(this,AnotherHandler.class.getSimpleName(),
               createAnotherHandler(ID));
} catch (Exception e) {
    log.error("Error occured", e);
} finally {
  buff.release();
}
}

第二个出站处理程序看起来非常相似,只是它处理不同类型的消息并添加更多检查

最后,我的问题是:

1] 在某些场景中,第二个出站处理程序不会被激活。当 我的测试中有断点。我正在考虑添加编码器,通过添加readableBytes检查将对象转换为ByteBuff。那有帮助吗?或者我上面的代码中缺少什么

2] 第二个处理程序中的写入未到达服务器应用程序。如何调试这个问题,任何指针都会有帮助

3] 我注意到一些ghost数据正在从我的websocket服务器转发到netty客户端,即使客户端应用程序不写任何东西。我不知道这些数据在哪里 来自哪里

请随意回答我上面的一个或多个问题


普拉桑纳

我找到了问题的答案:

1] Netty不允许在ChannelOutboundHandler中添加编码器,因此保留了现有的解决方案,我在其中执行足够可读字节的检查

2] 我在测试中遇到了一个错误,因为我试图读取错误端的响应


3] 没有ghost数据,我发现正在使用的测试框架正在发送额外的数据。

@norman maurer我已经阅读/观看了您的大部分文章/演示/示例,这非常有用。但是我没能为ChannelOutboudHandlers找到一个好的例子,你能给我指一个吗?@trustin我也读过你的帖子和例子。因此,请随意分享一些见解。