2017-12-09 25 views
0

クライアント側からサーバー側にファイルを送信しようとしています。ここで、WritableGUIは、テキスト領域にファイル名を表示するインタフェースです。ファイルはサーバーに転送されましたが、破損します。場合によっては、転送されるファイルサイズが正しい場合もありますが、ファイルサイズが0 KBになることがあります。私のコードで何が間違っていますか?ソケットプログラミングでファイルが破損する

クライアント側:

public class FileClient { 

    private Socket s; 
    private String fileName; 
    private long fileLength; 

    public FileClient(String host, int port, String file, String fileName, long FileLength) { 
     this.fileName = fileName; 
     this.fileLength = FileLength; 
     try { 
      s = new Socket(host, port); 
      sendFile(file); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void sendFile(String file) throws IOException { 
     DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
     FileInputStream fis = new FileInputStream(file); 
     byte[] buffer = new byte[1024]; 
     dos.writeUTF(fileName); 
     dos.writeLong(fileLength); 
     while (fis.read(buffer) > 0) { 
      dos.write(buffer); 
     } 
     fis.close(); 
     dos.close(); 
    } 
}  

サーバー側:いつものように

public class FileServer extends Thread { 

    ServerSocket server; 
    int port = 8877; 
    WritableGUI gui; 

    public FileServer(WritableGUI gui, int SOCKET_PORT) throws IOException { 
     this.port = SOCKET_PORT; 
     this.gui = gui; 

     try { 
      server = new ServerSocket(port); 
     } catch (IOException ex) { 
      Logger.getLogger(MessageListener.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void run() { 
     while (true) { 
      try { 
       Socket clientSock = server.accept(); 
       saveFile(clientSock); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    private void saveFile(Socket clientSock) throws IOException { 
     DataInputStream dis = new DataInputStream(clientSock.getInputStream()); 
     FileOutputStream fos = new FileOutputStream(dis.readUTF()); 
     byte[] buffer = new byte[1024]; 

     gui.write("File Received: " + dis.readUTF()); 

     long filesize = dis.readLong(); // read file size in separate msg 
     int read = 0; 
     int totalRead = 0; 
     int remaining = (int) filesize; 
     while ((read = dis.read(buffer, 0, Math.min(buffer.length, remaining))) >= 0) { 
      totalRead += read; 
      remaining -= read; 
      System.out.println("read " + totalRead + " bytes."); 
      fos.write(buffer, 0, read); 
     } 
     dis.close(); 
     fos.close(); 
    } 
} 

答えて

0
while (fis.read(buffer) > 0) { 
     dos.write(buffer); 
    } 

。間違ったコピーループ。試してみてください:

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

などの理由をよく考えてください。

+0

まだ動作しません。ファイルが破損する。 –

+0

私の回答を複製に見てください。 – EJP

関連する問題