我最近开始使用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);
}
答案 0 :(得分:2)
在Netty 3.10(4.0之前的任何版本)中,没有刷新,因为它是隐式的。
因此,当您执行ctx.getChannel().write(buf)
或channel.write(bug)
时,它应直接写入带内。
如果没有,则可能意味着您的处理程序存在问题。
您可以查看以下示例:Example source
答案 1 :(得分:0)
所以我发现了我的问题。我正在将StringEncoder / StringDecoder与ObjectEncoder / ObjectDecoder结合使用,它们正在弄乱彼此的字节。出于某种原因,这种情况并没有提前发生,但现在它对于那些可能遇到同样问题的人来说也是如此,请确保它们都没有被设置为处理程序。