java - 如何确保通过套接字流接收到整个文件?

标签 java sockets networking

好的,所以我正在制作一个具有服务器和客户端的 Java 程序,并且我正在从服务器向客户端发送一个 Zip 文件。我已经把文件发下来了,差不多了。但是收到后我发现了一些不一致之处。我的代码并不总是获得完整的存档。我猜它会在 BufferedReader 完成之前终止。这是客户端的代码:

public void run(String[] args) {
        try {
            clientSocket = new Socket("jacob-custom-pc", 4444);
            out = new PrintWriter(clientSocket.getOutputStream(), true);
            in = new BufferedInputStream(clientSocket.getInputStream());
            BufferedReader inRead = new BufferedReader(new InputStreamReader(in));
            int size = 0;
            while(true) {

                if(in.available() > 0) {    

                        byte[] array = new byte[in.available()];
                        in.read(array);
                        System.out.println(array.length);


                        System.out.println("recieved file!");
                        FileOutputStream fileOut = new FileOutputStream("out.zip");
                        fileOut.write(array);
                        fileOut.close();
                        break;
                    }
                }
            }
        } catch(IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }

那么在写入文件之前,我如何才能确定完整的归档文件就在那里?

最佳答案

在发送端写入文件大小,然后再开始写入文件。在阅读方面 阅读文件大小,以便了解预期的字节数。然后调用 read 直到你得到你期望的一切。使用网络套接字,可能需要多次调用才能读取发送的所有内容。当您的数据变大时尤其如此。

关于java - 如何确保通过套接字流接收到整个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18767656/

相关文章:

c++ - Linux上的C/C++多线程服务器/客户端崩溃

java - 在 ActionPerformed 上更改 GridLayout 中的 JButton 文本

python - 如何刷新 socket.gethostbyname 响应的缓存?

c++ - 套接字编程主机

sockets - 如何使用 python 在 ssl/tls 套接字连接中获取域的 IP

C# 列表与字节数组在网络上的效率

java - Gson 序列化/反序列化映射到/从 KeyValuePairs 列表

java - 如何在 Java 中创建目录?

java - 为什么应用程序遇到 OutOfMemoryError 时其他进程仍在运行

Java - ServerSocket IP 地址