gpt4 book ai didi

java - TCP 不发送确切的文件

转载 作者:可可西里 更新时间:2023-11-01 02:44:39 26 4
gpt4 key购买 nike

好的,所以我一直在研究一个轻量级的 TCP 传输应用程序,它几乎完成了,但是,我遇到了一个问题:每当我尝试发送文件时,它确实会被发送,但是当它到达时,它总是比发送的文件大几个字节。例如,如果我发送一张 111 093 字节大的图片,当它被接收时,它是 111 616 字节大。 (大 523 字节)

我仍然能够打开图像等,但如果我发送 .EXE 或 .JAR,由于这些额外的字节,它会在尝试启动时给我错误。

这些是我的代码:

发件人:

    public static void sendFileToServer(File file) {
try {
byteBuffer = new byte[1024];

//PREPARING FOR TRANSFER
output.writeObject("FILE:"+file.getName()+":" + byteBuffer.length);
output.flush();

Client.lblData.setText("Sending file...");

//TRANSFERRING
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));

byte[] buffer = new byte[1024];

while ((fis.read(buffer)) > 0) {
output.write(buffer, 0, buffer.length);
}
output.flush();
fis.close();

//TRANSFERRING
output.writeObject("END");
output.flush();

Client.lblData.setText("File sent!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
Client.lblData.setText("Waiting...");

} catch (IOException e) {
e.printStackTrace();
}
}

接收者:

if(file) {
try {
message = (String) input.readObject();
if(message.contains("END")) {
Server.conLabel.setText("Connected to: " + socket.getInetAddress().getHostName() + ":" + socket.getPort());
fos.flush();
fos.close();
file = false;
}
} catch (IOException | ClassNotFoundException e) {}

byte[] buffer = new byte[65536];
int number;

while ((number = input.read(buffer)) != -1) {
fos.write(buffer,0,number);
}

} else {
if (message.startsWith("FILE")) {
//PREPARING FOR FILE TRANSFER
file = true;

Server.conLabel.setText("Recieving file...");

for(int i = 0; i < Server.files.getSize(); i++) {
if(Server.files.getElementAt(i).equals(message.split(":")[1])) {
Server.list.setSelectedIndex(i);

if(!new File(Server.dlLoc.getText()).exists()) {
new File(Server.dlLoc.getText()).mkdirs();
}
if(!new File(Server.dlLoc.getText() + "/" + message.split(":")[1]).exists()) {
new File(Server.dlLoc.getText() + "/" + message.split(":")[1]).createNewFile();
}

fos = new FileOutputStream(new File(Server.dlLoc.getText() + "/" + message.split(":")[1]));
}
}
}

另外,这是我第一次做这样的事情,所以请告诉我这些代码中有用的其他事情。

最佳答案

111,616 = 1024 * 109

您正在发送方写入完整的缓冲区,而没有注意最后一个缓冲区很短的事实。改为这样做:

    int len;
while ((len = fis.read(buffer)) > 0) {
output.write(buffer, 0, len);
}

关于java - TCP 不发送确切的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20230394/

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