2016-04-23 4 views
0

クライアントからサーバへファイルをコピーする簡単なクライアントサーバアプリケーションをやっています。私はソケットを使っています。 Appsでは、クライアントメニューにいくつかのオプションが表示されます。1.サーバー上でコピーを作成します。2.サーバーなどからファイルコピーを取得します。サーバからクライアントへのファイルのコピー中に "ソケットがクローズされました"例外を解決する

問題は最初のオプションを選択するときです。私はこの例外について読んでいますが、私はこの問題をどのように解決するか考えていません。私はあなたのアイデアを楽しみにしています。

クライアント側コードの一部があります:

public Client(String host, int port) { 
     try { 
      s = new Socket(host, port); 
      System.out.println("Witaj w programie"); 
      boolean finished = false; 
      Scanner sc = new Scanner(System.in); 
      while(!finished){ 
       System.out.println("\n\n1.Zrob kopie zapasowa pliku"); 
       System.out.println("2. Przywroc kopie"); 
       System.out.println("0.Zakoncz"); 
       char c = sc.nextLine().charAt(0); 
       switch(c){ 
       case '1': 
        this.sendMessage(1); 
        makeCopy(s); 
        //s.close(); 
        break; ... 

sendMessageメソッドコード:

public void sendMessage(int message_id) throws IOException{ 
     oos = new ObjectOutputStream(s.getOutputStream()); 
     ois = new ObjectInputStream(s.getInputStream()); 
     oos.writeInt(message_id); 
     oos.flush(); 
    } 

とmakeCopyメソッドコード:Serverコードから

private void makeCopy(Socket clientSock) throws IOException { 
     File file = new File("D:\\klient\\doKopii.bmp"); 
     DataOutputStream dos = new DataOutputStream(clientSock.getOutputStream()); 
     FileInputStream fis = new FileInputStream(file); 
     byte[] buffer = new byte[4096]; 

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

     fis.close(); 
     dos.close(); 
    } 

ダウンロードコピー:

private void saveFile(Socket clientSock) throws IOException { 
     //DataInputStream dis = new DataInputStream(clientSock.getInputStream()); 
     FileOutputStream fos = new FileOutputStream("D:\\klient\\przywroconaKopia.bmp"); 
     File zSerwera = new File("D:\\serwer\\kopiaPliku.bmp"); 
     byte[] buffer = new byte[4096]; 

     int filesize = (int)zSerwera.length(); 
     int read = 0; 
     int totalRead = 0; 
     int remaining = filesize; 
     while((read = ois.read(buffer, 0, Math.min(buffer.length, remaining))) > 0) { 
      totalRead += read; 
      remaining -= read; 
      System.out.println("read " + totalRead + " bytes."); 
      fos.write(buffer, 0, read); 
     } 

     //fos.close(); 
     //ois.close(); 
    } 

私は、DataOutputStreamの終了によってソケットが閉じられているため、これが機能しないことに気付いています。私はこの行を削除しましたが、1つのオプションを選択してから2番目のオプションを選択すると、最初のアプリケーションが終了した時点でアプリケーションがフリーズします。

+0

uは( 'makeCopyを呼び出すことはできません。このアプローチを試してみてくださいBT非常に良いコーディングプラクティスではありません); 'とコードを試してください。 – Priyamal

+0

完了。しかし、それは意味がありませんか? – Infexo

+0

私はそれでも後にまだ例外があるのを知りたかったのですか? – Priyamal

答えて

0
oos = new ObjectOutputStream(s.getOutputStream()); 
    ois = new ObjectInputStream(s.getInputStream()); 

public void sendMessage(int message_id) throws IOException{ 
     oos.writeInt(message_id); 
} 

インスタンス変数としてoosoisを作成し、それらはただ1つの時間のためにインスタンス化されていることを確認してください。あなたが別々にデータ出力ストリームを取得する必要があり、なぜ あなたは同じObjectOutputStreamのにバイト配列を送信することができます

private void makeCopy(Socket clientSock) throws IOException { 
     File file = new File("D:\\klient\\doKopii.bmp"); 
     FileInputStream fis = new FileInputStream(file); 
     byte[] buffer = new byte[4096]; 

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

これは多分uは

+0

それは私をある程度助けましたが、今はsaveFileメソッドに問題があります。それは新しいファイルを作成しますが、それはコンテンツ/バイトを書きません(編集した投稿を見てください) – Infexo

+0

真剣に同じ投稿で別の質問をしなければなりませんか?この後に別のエラーが発生した場合はどうしますか? – Priyamal

+0

は、バイト配列を読み取るファイルに書き込む方法に関する記事です。http://www.java2s.com/Code/Java/File-Input-Output/Readfiletobytearrayandsavebytearraytofile .htm。これを正解としてマークすることを検討する必要があります。あなたは答えを得ているからです。 最初の編集の回答が得られた後、2番目の質問が尋ねられました – Priyamal

0

ここにいくつかの問題があります。

  • this answerに示すように、ファイルの長さをファイルよりも先に送信し、受信者でそのバイト数を正確に読み取る必要があります。
  • ストリームタイプを混在させたり、新しいストリームを作成したりしないでください。両端のソケットの寿命は同じObjectInputStream/ObjectOutputStreamのペアを使用してください。
+0

私はあなたのアドバイスを完全に理解していません。今、私はObjectInputStreamとObjectOutputStreamのみを使用しています。しかし、私はそれらのストリームを作成する必要がありますか?私が "oos"と "ois"ストリームの作成をsendMessageメソッドの外に移動したとき、appは以前より多くの例外を出します。 – Infexo

+0

まったく同じことを言う答えを受け入れたとしても、アドバイスを完全に理解できないのですか?それは部分的な答えだけですか? – EJP

+0

あなたがあなたのアドバイスを得なかったあなたのパストの後で、あなたが以前に答えたと思ってください。 Priyamalの答えの後、私は何が間違っていたのか理解しました。私はコメントを削除することはできません申し訳ありません...とにかく感謝。 – Infexo

関連する問題