我用Netty制作了一个服务器,但我遇到了一个问题。我创建的编码器没有被执行。
我在服务器上的管道:
bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast("encoder", new PacketEncoder());
ch.pipeline().addLast("decoder", new PacketDecoder());
ch.pipeline().addLast(new LoginServerChannel());
}
});
我的编码器:
public class PacketEncoder extends MessageToByteEncoder<Packet> {
@Override
protected void encode(ChannelHandlerContext channelHandlerContext, Packet packet, ByteBuf byteBuf) throws Exception {
System.out.println("Encoding");
}
我的解码器:
public class PacketDecoder extends ReplayingDecoder<DecoderState> {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
...
}
我的通道处理程序:
public class LoginServerChannel extends SimpleChannelInboundHandler<Packet> {
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, Packet packet) throws Exception {
channelHandlerContext.writeAndFlush(packet.encode());
System.out.println("Sending");
}
调用解码器,然后调用通道处理程序,但不调用编码器。我试图改变管道中的顺序,但同样的问题也试图使用fireChannelRead(...)和同样的问题。
谢谢
您的编码器扩展了< code>MessageToByteEncoder
在逻辑处理程序中,您可以
channelHandlerContext.writeAndFlush( packet.encode() );
我假设< code>encode()返回一个字节数组,所以您编码器会忽略它,什么也不做。
你可能应该做这样的事情:
channelHandlerContext.writeAndFlush( packet );
Netty 的是一个复杂和先进的框架,但它并不玄幻。当我们请求一些设置了 key 的给定值时,我们知道 Request 类的一个实例被创建来代表这个请求。但 Netty 并不知道 Request 对象是如何转成 Memcached 所期望的。Memcached 所期望的是字节序列;忽略使用的协议,数据在网络上传输永远是字节序列。 将 Request 对象转为 Memcached 所需的字节序列,N
看看文档,它说: https://netty.io/4.0/api/io/netty/channel/ChannelPipeline.html 假设用户在管道中有一个或多个ChannelHandlers来接收I/O事件(例如读取)和请求I/O操作(例如写入和关闭)。例如,一个典型的服务器在每个通道的管道中都有以下处理程序,但是根据协议和业务逻辑的复杂性和特征,这些处理程序可能会有所不同: 协议解码
我使用apache camel Netty使用此代码将ebcdic输入转换为ascii。 任何建议或答案...
我最近开始用netty做我的一个项目。为了理解netty是如何工作的,我实现了HexDumpProxy示例。当我在通道管道中添加StringDecoder和StringEncoder时,我遇到了一个问题,这会导致管道损坏。如果解码器/编码器不存在,程序会正常工作。有人能解释一下为什么会这样吗?非常感谢任何帮助! 下面我正在添加代码。 主要类别: 初始值设定项类: 前端处理程序类: 后端处理程序类:
我正在编写超文本传输协议-server,它将执行一些非常繁重的计算。我有一些与业务逻辑和阻塞IO相关的编码器-解码器管道。 所以我决定创建另一个工人 并在最开始添加简单的处理程序: 在内蒂这样做是不是很通俗?还是有更好的方法?
我希望将传入的Netty的消息转换为我的类的实例。为此,我使用以下: 现在,由于消息是引用计数的,我们必须在处理完它之后释放它。这是由我们正在扩展的自动完成的。 现在,既然ButeBuf已经发布,这难道不意味着支持阵列处于危险之中吗?它将被回收,我不确定我会在我的MyBuffer的数组中看到什么。 这个解码器可以安全使用吗?这是正确的编写方式吗?