我正在使用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
答案 0 :(得分:0)
我找到了问题的答案:
1] Netty不允许将编码器与ChannelOutboundHandler一起添加,因此将现有解决方案保留在我执行检查的足够可读字节的位置。
2]我的测试中有一个错误,因为我试图在错误的一端读取响应。
3]没有“ghost”数据,我发现正在使用的测试框架正在发送额外的数据。