Netty 写入数据接收不到?

发布于 2022-09-11 18:30:26 字数 1102 浏览 11 评论 0

public static void initChannel() throws InterruptedException{
        // Configure the client.
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
             .channel(NioSocketChannel.class)
             .option(ChannelOption.TCP_NODELAY, true)
             .handler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {}
             });
            SocketAddress socketAddress =  new InetSocketAddress(HOST, PORT);
            ChannelFuture future = b.connect(socketAddress).sync();
            //debug 确实触发了unsafe.write
            future.channel().writeAndFlush("hello world");
            future.channel().closeFuture().sync();
        } finally {
            group.shutdownGracefully();
        }
    }

此段代码,发送到hello world 丢失了[无论接收端有没有解码器]
但是当我在initChannel上加入 ch.pipeline().addLats(new StringEncoder())之后,
在服务端加入decoder就可以接收到

请问 encoder/decoder是必须的么? 不加消息为什么会丢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

温柔女人霸气范 2022-09-18 18:30:26

直接写字符串是不行的,必须是ByteBufFileRegion类型,可以对字符串封装一下:

ctx.writeAndFlush(Unpooled.copiedBuffer("hello world", CharsetUtil.UTF_8));

其实StringEncoder也是做的这件事。

    protected void encode(ChannelHandlerContext ctx, CharSequence msg, List<Object> out) throws Exception {
        if (msg.length() == 0) {
            return;
        }
        //封装字符串成Bytebuf
        out.add(ByteBufUtil.encodeString(ctx.alloc(), CharBuffer.wrap(msg), charset));
    }

NioChannel底层调用的写方法如下:

private int doWriteInternal(ChannelOutboundBuffer in, Object msg) throws Exception {
    if (msg instanceof ByteBuf) {
        ByteBuf buf = (ByteBuf) msg;
        if (!buf.isReadable()) {
            in.remove();
            return 0;
        }
        final int localFlushedAmount = doWriteBytes(buf);
        if (localFlushedAmount > 0) {
            in.progress(localFlushedAmount);
            if (!buf.isReadable()) {
                in.remove();
            }
            return 1;
        }
    } else if (msg instanceof FileRegion) {
        FileRegion region = (FileRegion) msg;
        if (region.transferred() >= region.count()) {
            in.remove();
            return 0;
        }
        long localFlushedAmount = doWriteFileRegion(region);
        if (localFlushedAmount > 0) {
            in.progress(localFlushedAmount);
            if (region.transferred() >= region.count()) {
                in.remove();
            }
            return 1;
        }
    } else {
        // Should not reach here.
        throw new Error();
    }
    return WRITE_STATUS_SNDBUF_FULL;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文