Java DataInputStream长度

Dav*_*eng 5 java sockets

我正在为学校作业创建一个文件服务器应用程序.我目前拥有的是一个Client通过TCP发送图像的简单类,以及一个Server接收它并将其写入文件的类.

这是我的客户端代码

import java.io.*;
import java.net.*;

class Client {
    public static void main(String args[]) throws Exception {
        long start = System.currentTimeMillis();
        Socket clientSocket = new Socket("127.0.0.1", 6789);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

        File file = new File("hot.jpg");
        FileInputStream fin = new FileInputStream(file);
        byte sendData[] = new byte[(int)file.length()];
        fin.read(sendData);

        outToServer.write(sendData, 0, sendData.length);
        clientSocket.close();

        long end = System.currentTimeMillis();
        System.out.println("Took " + (end - start) + "ms");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的服务器代码.

import java.io.*;
import java.net.*;

class Server {
    public static void main(String args[]) throws Exception {
        ServerSocket serverSocket = new ServerSocket(6789);
        Socket connectionSocket = serverSocket.accept();
        DataInputStream dis = new DataInputStream(connectionSocket.getInputStream());

        byte[] receivedData = new byte[61500]; // <- THIS NUMBER

        for(int i = 0; i < receivedData.length; i++)
            receivedData[i] = dis.readByte();

        connectionSocket.close();
        serverSocket.close();

        FileOutputStream fos = new FileOutputStream("received.jpg");
        fos.write(receivedData);
        fos.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何获取正在发送的文件的大小.如果你检查Server代码,你会看到我已经硬编码了这个数字,即61500.如何动态检索此数字?

或者,我这样做是错误的吗?什么是替代解决方案?

dac*_*cwe 7

在发送文件之前添加一个"长度字段".(注意,由于您将文件读取到内存中,文件的最大大小可以是~2GB.)


在发送文件之前写入文件的长度:

  outToServer.writeInt(sendData.length);
Run Code Online (Sandbox Code Playgroud)

当接收首先读取长度并将其用作长度时:

  int dataLength = dis.readInt()
  byte[] receivedData = new byte[dataLength];
Run Code Online (Sandbox Code Playgroud)

更好的方法是先将文件读入内存,而是直接从FileInputStream文件传输 - 然后你可以传输更大的文件!