【问题标题】:Java SocketChannel send multiple files over one socketchannel possible?Java SocketChannel 可以通过一个套接字通道发送多个文件吗?
【发布时间】:2014-05-28 04:27:02
【问题描述】:

我需要一些关于如何在通过套接字通道完成发送文件后无需在服务器端进行 sc.shutdownOutput() 调用的情况下推送流结束字符的建议。

这是来自服务器端的一点

        long curnset = 0l;
        long temp = 0l;
        int maxCount = 8192 * 1024;
        logger.debug(AUDIT, "begin sending {}", filenameSize);
        while (curnset < fsize)
        {
            temp = inChannel.transferTo(curnset, maxCount, sc);
            curnset += temp;
            logger.debug(AUDIT,"c {} | t {} | max {} | size {}",curnset,temp,maxCount,fsize);
        }
        logger.debug(AUDIT, "end sending {}", filenameSize);

这里是客户端:

        logger.debug(AUDIT, "begin receiving {}", filenameSize);
        while (curnset < this.fileSize)
        {
            logger.debug(AUDIT,"inside of while loop");
            temp = outChannel.transferFrom(sc, curnset, maxCount);
            curnset += temp;
            logger.debug(AUDIT, "c {} | t {} | max {} | size {}", curnset, temp,
                    maxCount, this.fileSize);
        }
        logger.debug(AUDIT, "end receiving {}", filenameSize);

程序的行为如下: 服务器将完成其代码部分,同时客户端将挂在 logger.debug(AUDIT,"inside of while loop");只有当我在服务器端按 ctrl-c 时,客户端才会最终完成那部分代码——但缺少字节——大约比 fileSize 少几千字节。

我已经为客户端和服务器建立了文件大小。 我用于从服务器向客户端发送单个文件的同一部分代码,但在 sc.shutdownOutput() 中有所不同——如果我调用它,我无法通过相同的套接字通道重新发送另一个文件。我不想关闭socketchannel的输出。

还有其他办法吗?

提前致谢。

【问题讨论】:

    标签: java flush socketchannel


    【解决方案1】:

    在循环中调用transferTo() 是正确的,但是每次transferTo() 返回时,您需要将maxCount 减少传输计数。

    【讨论】:

    • 递减 maxCount ?比如 maxCount -= temp ?不太确定这是否会有所帮助,因为在这种情况下 maxCount 的值不会改变 = 8192 * 1024。 transferTo 和 transferFrom 将从 curnset 的位置转移到 maxCount 字节。如果我在循环中保持递减 maxCount -= temp,那么我在 maxCount 中将没有任何价值。最大计数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多