2014-04-22 39 views
0

我做了一个代码,发送文件从一台计算机到另一台, 问题是,一个发送后不工作了。 我知道问题出在我写给作者的时候,但我不知道为什么它不起作用。通过套接字发送文件只能工作一次

客户端:

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!"); 
       } 
+0

提示:文件中发生的事情不是步长的精确倍数? (在写作方面)如果'completed == filesize'你在读什么(在文件结尾之后)? –

+0

我没有读完文件结束后什么也没有读完,==完成了文件的发送。 – user3561290

+0

你是什么意思,你是“发送结束”?你似乎在读另一个缓冲区并写入它。 –

回答

0

您需要冲洗流到底,即使该文件不为0字节长。尝试实施这种改变,并告诉我它是否仍然给你带来麻烦。

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

+0

+0我几乎可以保证这一点,即使流被缓冲,因为字节[]太大而不能放入缓冲区。如果它没有被缓冲(它不应该),它肯定没有区别。 –