gpt4 book ai didi

java - 使用 Java 套接字和 DataStreams 进行文件传输的问题

转载 作者:行者123 更新时间:2023-12-01 22:16:06 25 4
gpt4 key购买 nike

我一直在为自己和一些 friend 开发聊天客户端,并决定尝试添加功能以允许客户端之间的文件传输。我可以发送文件,但它到达时的状态与发送的文件不同。例如,这里是一个比较发送图像之前和之后的链接:

/image/VJkOE.jpg

别问我为什么用那张照片,这只是我在图片文件夹中找到的第一张照片......以下是发送和接收方法:

public static Runnable sendFile(String target, File file, Client client) {
Runnable run = () -> {
FileOutputStream fileOut = null;
try {
int total = 0;
int count;
byte[] fileBuffer = new byte[8192];
BufferedInputStream fileStream = new BufferedInputStream(new FileInputStream(file));
client.getTextOutData().writeUTF("*!sendfile: " + client.getClientName() + " " + target + " " + file.getName() + " " + (int) file.length());
fileOut = new FileOutputStream(new File(downloadsPath + "/" + file.getName()));
System.out.println("Send length: " + file.length());
while ((count = fileStream.read(fileBuffer, 0, (int) Math.min(8192, file.length() - total))) == 8192) {
total += count;
System.out.println("Sender count: " + count);
client.getDLOutData().write(fileBuffer, 0, count);
client.getDLOutData().flush();
fileOut.write(fileBuffer, 0, count);
}
total += count;
System.out.println("Sender count: " + count);
System.out.println("Sender total: " + total);
//client.getDLOutData().write(fileBuffer, 0, count);
fileOut.write(fileBuffer, 0, count);

System.out.println("Sending done, eh?");
fileStream.close();
Thread.currentThread().interrupt();
} catch (Exception e) {
Platform.runLater(() ->Popups.startInfoDlg("Download Error", "Failed to send file!"));
e.printStackTrace();
}
};

return run;

}

public static Runnable dlFile(MainScreenController sc, File file, long length) {
Runnable run = () -> {
FileOutputStream fileOut = null;
try {
int total = 0;
int count;
byte[] fileBuffer = new byte[8192];
fileOut = new FileOutputStream(file);
System.out.println("DL length: " + length);
while ((count = sc.getClient().getDLInData().read(fileBuffer, 0, (int) Math.min(8192, length - total))) == 8192){
total += count;
System.out.println("DL count: " + count);
fileOut.write(fileBuffer, 0, count);
}
total += count;
System.out.println("DL count: " + count);
System.out.println("DL total: " + total);
//fileOut.write(fileBuffer, 0, count);
} catch (IOException e) {
System.out.println("Failed to download file.");
e.printStackTrace();
} finally {
try {
fileOut.flush();
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Download complete.");
Thread.currentThread().interrupt();
}
};

return run;

}

如果您对问题所在有任何想法,我很想听听。如果您需要查看更多帮助,我还可以尝试为整个项目设置一个 Git。感谢任何帮助,我才刚刚开始学习 java。

最佳答案

您似乎错过了发送文件尾部的情况。在第 12 行的 while 循环中,当您发送文件的最后一部分时,它将小于 8192 字节,除非文件是 8192 字节长的直接倍数。您将需要添加一些代码来处理这个栅栏柱问题。当您读入最后一个 (file.length() % 8192) 字节时,count 不等于 8192,因此 while 循环不会执行。这意味着数据永远不会写入缓冲区。

我认为如果您对两张图片进行比较,收到的图片会丢失最后一个 (file.length() % 8192) 字节。

关于java - 使用 Java 套接字和 DataStreams 进行文件传输的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30994553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com