在Netty中结合WebSocket实现ChannelOutboutHandler

时间:2014-10-20 19:47:13

标签: netty

我正在使用Netty 4.0.19,并试图为Netty Client充当客户端应用程序和服务器应用程序之间的代理的场景实现ChannelOutboudHandler。它看起来如下

<客户端应用程序> ---(网络套接字)--------> < Web套接字服务器=转发数据=> Netty客户端> ---- [netty pipeline] --- [出境处理程序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]在某些情况下,第二个出站处理程序不会被激活。它适用于 在我的测试中有断点。我正在考虑添加Encoders以将Object转换为ByteBuff并添加readableBytes()检查。这会有帮助吗?或者我的上述代码中缺少什么?

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

3]我注意到了一些"鬼"数据从我的websocket服务器转发到netty客户端,即使客户端应用程序没有写任何东西。我不确定这些数据在哪里 来自?

请随时回答上述一个或多个问题。

人员Prasanna

1 个答案:

答案 0 :(得分:0)

我找到了问题的答案:

1] Netty不允许将编码器与ChannelOutboundHandler一起添加,因此将现有解决方案保留在我执行检查的足够可读字节的位置。

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

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