【问题标题】:sending file over socket only works one time通过套接字发送文件只能工作一次
【发布时间】:2014-06-07 03:44:38
【问题描述】:

我编写了一个代码,将文件从一台计算机发送到另一台计算机, 问题是,在发送后它不再工作了。 我知道问题出在我给作者写信时,但我不知道为什么它不起作用。

客户:

    File file =new File(path);
    long fileSize = file.length();
    long completed = 0;
    int step = 150000;
    Request req = new Request(RequetType.DOWNLOAD_FILE,file.getName());
    writer.writeObject(req);
    writer.flush();
    // creates the file stream
    FileInputStream fileStream = new FileInputStream(file);

    // sending a message before streaming the file
   // writer.writeObject("SENDING_FILE|" + file.getName() +"|" + fileSize);
    writer.reset();
    byte[] buffer = new byte[step];
    while (completed <= fileSize) {
        fileStream.read(buffer);
        writer.write(buffer);
        completed += step;
    }
    System.out.println(completed);
    //writer.writeObject("SEND_COMPLETE"); 
    fileStream.close();

服务器:

                String filename = (String)req.getContent();

                try {
                    FileOutputStream outStream =new FileOutputStream(Startdir+""+filename);
                    byte[] buffer = new byte[200000];
                    int bytesRead = 0, counter = 0;

                    bytesRead = this.reader.read(buffer);  
                    if (bytesRead >= 0) {
                        outStream.write(buffer, 0, bytesRead);
                        counter += bytesRead;
                        System.out.println("total bytes read: " +
                                                        counter);
                    }
                    if (bytesRead < 1024) {
                        outStream.flush();
                    }
                    while (true) 
                    {
                        bytesRead = this.reader.read(buffer);
                        if (bytesRead >= 0) {
                            outStream.write(buffer, 0, bytesRead);
                            counter += bytesRead;
                            System.out.println("total bytes read: " +
                                                            counter);
                        }
                        if (bytesRead ==0) 
                        {
                            outStream.flush();
                            break;
                        }
                    }
                    System.out.println("Sent:"+filename+"  from:"+MainApp.computersconnection.getIp());

                } catch (Exception e) {
                    System.out.println("Error on downloading file!");
                }

【问题讨论】:

  • 提示:文件中发生的事情不是步长的精确倍数? (在写作方面)如果completed == filesize 你在读什么(在文件结束之后)?
  • 文件结束后我什么都不读,完成后==文件大小发送端的大小。
  • 你是什么意思你是“发送端”?您似乎正在读取另一个缓冲区并写入它。
  • 我不能使用另一个缓冲区,因为你在客户端看到的是当我点击按钮开始时的动作
  • 我建议;如果您已阅读所有数据,为什么还要尝试做任何事情? (我没有提到另一个缓冲区)

标签: java sockets client send sendfile


【解决方案1】:

即使文件不是 0 字节长,您也需要最后刷新流。尝试实施该更改并告诉我它是否仍然给您带来麻烦。

(发送完文件后刷新输出流)。

【讨论】:

  • +0 我几乎可以保证,即使流被缓冲,因为 byte[] 太大而无法放入缓冲区,这也没什么区别。如果它没有被缓冲(也不应该被缓冲),那肯定不会有任何区别。
猜你喜欢
  • 2011-06-14
  • 2011-02-24
  • 2012-07-12
  • 2015-08-28
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多