当前位置: 首页 > 知识库问答 >
问题:

Netty:ChannelProgressiveFutureListener未使用DefaultFileRegion调用

益泰平
2023-03-14

我正在使用一个去福尔菲区域从我的基于网络的服务器进行下游访问。当客户端接收数据时,我添加到频道未来的频道进程接收器永远不会被调用。我在使用netty编程方面不是很有经验,所以我认为我误解了nettys渐进式频道未来的工作原理。因此,我在这里查看了我在这里找到的示例代码:programcreek.com.但它基本上是相同的代码?我试图在这里找到类似的问题,但找不到原因。提前感谢您的任何提示,为什么听众永远不会被叫到。

   long todo = file.length () - mRequest.pCursor;
    ctx.writeAndFlush (mFileCursorPacket.encodeInformation (new FileCursor (mRequest.pToken, todo)));


    mFileregion = new DefaultFileRegion (file, mRequest.pCursor, todo);
    ChannelFuture future = ctx.writeAndFlush (mFileregion,ctx.newProgressivePromise ());

    //the listener that is never called!
    future.addListener (new ChannelProgressiveFutureListener () {
        @Override
        public void operationProgressed (ChannelProgressiveFuture future, long progress, long total) throws Exception {
            O.debug (mSession.getId ()+": downloaded "+progress+" bytes  = "+String.valueOf ((float)progress/(float)total));
        }

        @Override
        public void operationComplete (ChannelProgressiveFuture future) throws Exception {
            boolean success = future.isSuccess ();
            O.info (mSession.getId () + ": downloaded successfull: " + success);
            if (mFileregion != null) mFileregion.release ();
            mFileregion = null;
        }
    });

我的管道看起来像这样:

        ServerBootstrap b = new ServerBootstrap (); // 
        b.group (mBossGroup, mWorkerGroup).channel (NioServerSocketChannel.class) // 
                //.channel(ServerSocketChannel.class)
                .childHandler (new ChannelInitializer<SocketChannel> () { // 
                    @Override
                    public void initChannel (SocketChannel ch) throws Exception {

                        ProtocolMessageInboundHandler inboundHandler = new ProtocolMessageInboundHandler ();
                        inboundHandler.setMessageSizeLimit (MAX_PACKET_LENGTH);
                        ch.pipeline ().addLast (ReadTimeoutHandler.class.getName (), new ReadTimeoutHandler (SO_TIMEOUT_STD));
                        ch.pipeline ().addLast (NAME_PROTOCOL_MESSAGE_INBOUND, inboundHandler);
                        ch.pipeline ().addLast (NAME_PROTOCOL_MESSAGE_OUTBOUND, new ProtoclMessageOutboundHandler ());

//context passed to the LoginHandler is a ServerContext and has nothing to do with netty
                        ch.pipeline ().addLast (LoginHandler.class.getName (), new LoginHandler (context));
                        ch.pipeline ().addLast (TimeoutHandler.class.getName (), new TimeoutHandler ());


                    }
                }).option (ChannelOption.SO_BACKLOG, 128).childOption (ChannelOption.SO_KEEPALIVE, true); // 

        // Bind and start to accept incoming connections.
        b.bind (PORT).sync ();

而文件发送处理程序被插入ProtocolMessageInboundHandler之后(它只修改byte[]对象并传递bytebuf对象)。因此,在文件发送处理程序和?之间没有其他处理程序?内蒂?

共有1个答案

房冥夜
2023-03-14

如果要发送FileRegion,则管道中应该有一个可以发送此类对象的处理程序。Netty中用于此目的的最常用类是ChunkedWriteHandlerDefaultFileRegion的示例中也使用了此选项。

将以下代码添加到您的初始值设定项中,使其支持< code>FileRegions:

ch.pipeline ().addLast(new ChunkedWriteHandler());
 类似资料:
  • 这是示例代码。在使用mockito或@Beofre注释之前,一切似乎都很好。现在它可以正确地模拟对象,但某些工厂没有正确地自动连接。 在莫基托之前,一切都很顺利。

  • 问题内容: 在Obj-C中,常见的做法是使用便利功能执行常见的操作,例如为视图配置自动布局: 如果您只需要设置约束而忘了它,则可以调用: 如果要稍后存储约束以便可以删除/修改约束,则可以执行以下操作: 我想快速执行此操作,但是如果我调用上述函数并且不捕获返回的约束,则会收到警告: 很烦人。有什么方法可以让Swift知道我并不总是想获取返回值吗? 注意:我知道这一点。这很丑陋,而不是我要的东西: 问

  • 我遇到了有趣的意图工作流处理。我创建了一个通知,如下所示: 当通知到达用户时,我希望当他点击它时 MainActivity.class将处理此意图。我在中处理有关意图的信息。 如果我点击应用程序外的通知,一切正常。活动正确地处理了这个意图并显示了我所期望的。 但是当我在我的应用程序中点击通知时,我的和没有触发。我以为它会被创建为的新实例 你能解释一下这是默认行为吗?我应该如何处理这种情况? 在测试

  • 我正在开发一个带有ActionBars的应用程序,它支持姜饼和其他功能。所以基本上我在使用支持库并扩展 行动B活动 对于我所有的活动。除了 onSupportNavigateUp() 方法。它只是不被调用在留档中所述。 每当用户选择从操作栏在应用程序的活动层次结构中向上导航时,就会调用此方法。 这很容易,但我一直不明白为什么它不能像预期的那样工作,谷歌也帮不上忙。这是虫子吗?还是我错过了什么?

  • 运行playstore Build Apk时,未调用Marshmallow Runtime Permissions onRequestPermissionsResult,但正常调试Apk时运行良好。谁来帮帮我。。谢谢 OnRequestPermissionResult方法

  • 我很难让正常工作。无论我怎么努力,我都不能让它被称为。 我的应用程序的体系结构如下所示:我的主活动包含一个片段,其中包含一个ViewPager,而ViewPager又有四个子片段实例。目前,我正在(成功地)用填充活动中的初始选项菜单,但我希望添加一些对应于每个活动子片段的额外选项。 如果有人知道这里发生了什么,我会非常感激,因为我已经被困在这个问题上两天了。 更新--我已经搞清楚了现在的问题是什么