Netty 3.10最终没有Channel.WriteAndFlush?

时间:2015-05-22 02:23:41

标签: networking netty

我最近开始使用Netty并且下载了Netty的最终版本(3.10),我正在按照基本教程开始并从客户端写入服务器,但是我遇到了问题。

我正在使用服务器的通道引用来编写:

channel.write(obj);

其中频道的类型为频道,但在我的处理程序中永远不会收到它(是的,我的处理程序正常工作并接收连接和断开连接)。

我做了一些研究并看到使用channel.writeAndFlush(obj),但这不是一个实际的方法。我查看了以前的测试版和alpha版本,方法就在那里,但也有其他一些变化。那么channel.write(obj)不起作用还是我在调用write(obj)之后错过了另一个步骤?我希望能够随时写入频道,所以我不会有ChannelHandlerContext,只有当它被传递给处理程序时。

任何帮助都将不胜感激。

修改

在我的管道中,我输入了Delimeter,字符串编码器,字符串解码器和我的事件处理程序 ServerListener

new DelimiterBasedFrameDecoder(server.getConfig().PACKET_BUFFER_SIZE, Delimiters.lineDelimiter()), new StringEncoder(), new StringDecoder(), new ServerListener()

在客户端,我有相同的处理程序,不包括 ServerListener

然而,在向频道发送字符串时(是的,它会打印连接到服务器

@Override
public void channelConnected(ChannelHandlerContext ctx, Connection con, ChannelStateEvent e) {
    System.out.println("Connected To Server");
    Channel c = ctx.getChannel();
    c.write("Test");
}

即使我继承了messageReceived方法,即使我继承 channelConnected 的其他方法也能正常工作,服务器端也不打印任何内容。

这是我的 messageReceived 方法:

@Override
public void messageReceived( ChannelHandlerContext ctx, MessageEvent e) throws Exception {
    System.out.println("Received");
    super.messageReceived(ctx, e);
}

2 个答案:

答案 0 :(得分:2)

在Netty 3.10(4.0之前的任何版本)中,没有刷新,因为它是隐式的。

因此,当您执行ctx.getChannel().write(buf)channel.write(bug)时,它应直接写入带内。

如果没有,则可能意味着您的处理程序存在问题。

您可以查看以下示例:Example source

答案 1 :(得分:0)

所以我发现了我的问题。我正在将StringEncoder / StringDecoder与ObjectEncoder / ObjectDecoder结合使用,它们正在弄乱彼此的字节。出于某种原因,这种情况并没有提前发生,但现在它对于那些可能遇到同样问题的人来说也是如此,请确保它们都没有被设置为处理程序。