Java SocketChannel可以通过一个socketchannel发送多个文件吗?

时间:2014-05-28 04:27:02

标签: java flush socketchannel

我需要一些关于如何推送流结束字符的建议,而不必在完成通过套接字通道发送文件后在服务器端进行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,&#34; while循环内部#34;);只有当我在服务器端ctrl-c时,客户端最终才会完成代码部分 - 但缺少字节 - 大约几千字节的文件大小。

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

还有其他方法吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您通过在循环中调用transferTo()来做正确的事情,但每次maxCount返回时,您需要按照传输计数递减transferTo()