【问题标题】:Java Send file via SocketJava 通过 Socket 发送文件
【发布时间】:2020-03-15 00:24:27
【问题描述】:

我正在编写一个类,用于通过 Java 中的套接字进行 2 路发送文件 这里是on GitHub。 在文件接收完成之前一切都很好。 很快:

  • 在 client.java 中是硬编码到 C:\Maven\README.txt 的方式
  • 首先我发送文件名
  • 然后我发送文件长度
  • 第三步,我将文件从 FileInputStream 发送到 DataOutputStream

在客户端:

byte[] bytes = new byte[(int)forSend.length()];
InputStream fin = new FileInputStream(forSend);
int count;
while ((count = fin.read(bytes)) > 0) {
    out.write(bytes, 0, count);
}
fin.close();
fout = new FileOutputStream(filename);
byte[] bytes = new byte[length];
System.out.println("receiving file...");
int count;
while ((count = in.read(bytes)) > 0) {
    fout.write(bytes, 0, count);
}
fout.flush();
fout.close();
  • 服务器上的文件已完全接收(长度和内容相同)

当我尝试添加代码以在之后向套接字写入内容时,启动服务器和客户端后正在等待某些内容(我不知道是什么)

以前我在丢失一次 DataInputStream 读取时遇到这种情况(从服务器发送的消息,但客户端上没有此消息的接收者)。但目前我正在尝试添加在文件传输完成后更改的标志并稍后检查它的状态。它在服务器和客户端上都可以工作,但是从/向 Socket 添加读/写会使我回到服务器和客户端都在等待某些东西的情况。

现在怎么了?

【问题讨论】:

  • UPD:[ENG] 我试图将读/写移出发送功能。如果客户端是发件人而服务器是收件人 - 服务器会因 EOFException 而崩溃。但我不知道这是什么原因。 [俄罗斯] Попробовал вынести последующую чтение/отправку по сокету из функции。 Если клиент отправляет, а сервер принимает сообщение после передачи файла, то сервер ловит EOFException。 Но не догоняю чем он вызван.

标签: java file sockets transfer


【解决方案1】:

我的朋友Denr01 帮助了我,所以我的错误是控制了文件长度,我的问题中没有任何地方。因此,我的“完成”确认被写入文件。 解决问题的方法在发件人:

int read = 0;
int block = 8192;
int count = 0;
byte[] bytes = new byte[block];
while (read != forSend.length()) {
    count = fin.read(bytes, 0, block);
    out.writeInt(count);
    out.write(bytes, 0, count);
    read += count;
    System.out.println("already sent " + read + " bytes of " + forSend.length());
}
  1. 发送方读取字节并写入字节数
  2. 它将计数发送给接收方,因此接收方将知道在当前循环迭代中要接收多少字节
  3. 然后发送方发送字节块并增加读取的字节计数器
  4. 在计数器不等于文件长度时重复此操作

在发件人中:

int block = 8192;
int count = 0;
int read = 0;
byte[] bytes = new byte[block];
System.out.println("recieving file...");
while (read != length) {
    block=in.readInt();
    in.readFully(bytes, 0, block);
    fout.write(bytes, 0, block);
    read += block;
    System.out.println("already recieved " + read + " bytes of " + length);
}
  1. 制作长度等于发送方块长度的字节数组
  2. 在每次迭代中,首先读取下一个块长度,然后读取此字节数
  3. 增加接收者的计数器
  4. 当计数器不等于之前收到的文件长度时重复此操作

在这种情况下,我们可以控制每个文件读取迭代,并且始终知道要接收多少字节,因此当接收到的所有字节都相同时,下一个“消息”将不会写入文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2015-10-04
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多