【问题标题】:Transfer Large Files using nio socket使用 nio 套接字传输大文件
【发布时间】:2014-01-29 20:03:15
【问题描述】:

我是编程新手。我想制作一个程序来使用java通过网络传输大文件。有人请告诉我如何编写这样一个程序,它可以有效地通过网络传输任何大小的文件。一个人告诉我为文件使用套接字通道和套接字通道,但由于我是初学者,我无法编写“质量代码”。提前致谢。

【问题讨论】:

  • 试一试,写一些代码,如果遇到问题,请回复我们。

标签: java sockets


【解决方案1】:

您不需要 NIO。 Java中流之间复制的标准方式如下:

while ((count = in.read(buffer)) > 0)
 {
    out.write(buffer, 0, count);
}

这适用于任何大于零的缓冲区大小。我通常使用 8192 字节或更多。请注意,如果不将 read() 结果存储到变量中,您将无法正确执行此操作,这与您在其他地方可能读到的相反。

您需要添加代码来创建和接受 Socket 并获取其输入和输出流,以及打开文件输入和输出流,并在完成后关闭所有内容,

【讨论】:

    【解决方案2】:

    这个简单的示例将对您有所帮助。这行得通,你需要适应你的情况。

    public static void main(String[] args) throws Exception {
        new Thread() {
            public void run() {
                ServerSocket server = null;
    
                try {
                    try {
                        server = new ServerSocket(8882);
    
                        Socket socket = server.accept();
    
                        InputStream is = socket.getInputStream();
    
                        byte[] bytes = new byte[1024];
    
                        while (is.read(bytes) != -1) {
                            System.out.println(new String(bytes));
                            bytes = new byte[1024];
                        }
                    } finally {
                        if (server != null)
                            server.close();
                    }
                } catch(Exception ex) {
                    ex.printStackTrace();
                }
            };
        }.start();
    
        Socket socket = new Socket("localhost", 8882);
        OutputStream out = socket.getOutputStream();
    
        FileInputStream fis = new FileInputStream(new File("/c:/zipfile.zip"));
    
        byte[] bytes = new byte[1024];
    
        while (fis.read(bytes) != -1) {
            out.write(bytes);
            bytes = new byte[1024];
        }
    
        fis.close();
    
        out.close();
        socket.close();
    }
    

    【讨论】:

    • 这段代码不能正常工作,完全没有必要重新创建 byte[] 缓冲区。 -1
    • 没有工作?显示使用套接字的数据传输。有什么问题?你希望什么?
    • 它不起作用,因为您假设 read() 填充了缓冲区,并且传输大小是缓冲区大小的倍数。显然你没有测试它。仔细查看用于 read() 的 Javadpc。
    • 但这行得通,我测试过。如果您运行代码,您将看到控制台中显示的文件内容。我知道,缓冲区并不总是完全填满,但是重新创建 byte[] 可以保持缓冲区清洁以进行新的读取。我相信谁让新的 byte[] 让代码更干净,而不是使用 read(byte[],int,byte[].length)。感谢您的新评论。
    猜你喜欢
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多