使用Java套接字和数据流进行文件传输时出现问题

使用Java套接字和数据流进行文件传输时出现问题,java,sockets,Java,Sockets,我一直在为自己和一些朋友开发一个聊天客户端,并决定尝试添加允许客户端之间进行文件传输的功能。我可以发送文件,但它到达的状态与发送的文件不同。例如,这里有一个链接,比较发送图像的前后: 别问我为什么用那张照片,这只是我在照片文件夹里找到的第一张。。。 以下是发送和接收方法: public static Runnable sendFile(String target, File file, Client client) { Runnable run = () -> {

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

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

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)字节。

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


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

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


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

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


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

读取文件的典型习惯用法是:


字节[]文件缓冲区=新字节[8192];
而((count=fileStream.read(fileBuffer))>0){
//对文件缓冲区中的计数字节执行某些操作
}


如果文件的字节数较少,则会给出该字节数,并在
EOF

处返回-1。读取文件的典型习惯用法是:


字节[]文件缓冲区=新字节[8192];
而((count=fileStream.read(fileBuffer))>0){
//对文件缓冲区中的计数字节执行某些操作
}


如果文件的字节数较少,则会给出该字节数,并在
EOF

处返回-1。读取文件的典型习惯用法是:


字节[]文件缓冲区=新字节[8192];
而((count=fileStream.read(fileBuffer))>0){
//对文件缓冲区中的计数字节执行某些操作
}


如果文件的字节数较少,则会给出该字节数,并在
EOF

处返回-1。读取文件的典型习惯用法是:


字节[]文件缓冲区=新字节[8192];
而((count=fileStream.read(fileBuffer))>0){
//对文件缓冲区中的计数字节执行某些操作
}


如果文件的字节数较少,它会给出相应的字节数,并在
EOF

处返回-1,问题是由于while循环中的条件,您没有读取和发送文件的最后一部分:

此条件不允许从源文件读取并发送最后一部分。将
==8192
部分更改为
>0
,让最后一部分发送

您还应该在
dlFile
方法中更改此条件


祝您好运。

问题在于您没有读取和发送文件的最后一部分,因为while循环中存在以下情况:

此条件不允许从源文件读取并发送最后一部分。将
==8192
部分更改为
>0
,让最后一部分发送

您还应该在
dlFile
方法中更改此条件


祝您好运。

问题在于您没有读取和发送文件的最后一部分,因为while循环中存在以下情况:

此条件不允许从源文件读取并发送最后一部分。将
==8192
部分更改为
>0
,让最后一部分发送

您还应该在
dlFile
方法中更改此条件


祝您好运。

问题在于您没有读取和发送文件的最后一部分,因为while循环中存在以下情况:

此条件不允许从源文件中读取最后一部分