Java 套接字 - 数据在上次写入时重复

Java Sockets - Data duplicated on last write

我使用以下代码向客户端发送文件:

private void sendFile(Socket client) throws Exception {
        byte[] data = new byte[4096];
        DataOutputStream dos = new DataOutputStream(client.getOutputStream());
        FileInputStream fis = new FileInputStream("test.txt");

        while (fis.read(data, 0, data.length) != -1) {
            dos.write(data);
        }

        fis.close();
        dos.close();
}

我发现的问题是传输后文件大小不同。经过进一步调查,我发现文件在最后 dos.write(data).

被复制

示例:

原文件:

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Cras dictum diam neque, eu dictum sem efficitur ut.
Ut eu hendrerit risus.
In dapibus vel lectus at egestas.

传输的文件:

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Cras dictum diam neque, eu dictum sem efficitur ut.
Ut eu hendrerit risus.
In dapibus vel lectus at egestas.
Ut eu hendrerit risus.
In dapib

我已经无计可施了,我已经查看了数百个试图解决此问题的示例。我试过 dos.flush(),将读取更改为 dos.read(data),并更改 while 循环条件。我希望传输非常大的文件,所以我不想一次加载所有文件。

编辑:

我一直在命令行中使用 telnetnetcat 来测试下载。

看这个方法

https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html#write(byte[],%20int,%20int)

https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#read(byte[],%20int,%20int)

len - the maximum number of bytes read.

和returns

the total number of bytes read into the buffer

您只想写入之前读取的字节数

所以

  int br = -1;
  while ((br = fis.read(data, 0, data.length)) != -1) {
        dos.write(data, 0, br);
  }