TCP不发送确切的文件

Nin*_*ine 1 java tcp file

好吧,所以我一直在研究一个轻量级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();
    }
}
Run Code Online (Sandbox Code Playgroud)

RECIEVER:

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]));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}

此外,这是我第一次做过这样的事情,所以请告诉我其他在这些代码中有用的东西.

Jim*_*son 6

111,616 = 1024*109

您正在向发送方写入完整的缓冲区,而不是注意最后一个缓冲区很短的事实.改为:

    int len;
    while ((len = fis.read(buffer)) > 0) {
        output.write(buffer, 0, len);
    }
Run Code Online (Sandbox Code Playgroud)