2017-03-08 3 views
0

私のプログラミングは、物事を説明することが非常にうまくいきません。Javaソケット:ファイルを送信した後にソケットを開いたままにするにはどうすればいいですか?

私がしたことは、LAN経由で通信できる簡単なチャットプログラムが作成されたことです。私は最近ソケットを介してファイルを送信できるようにしました

これは、以下に示すファイル選択を開くボタンがあるフレームです。

public void actionPerformed(ActionEvent arg0) { 
      JFileChooser chooser = new JFileChooser(); 
      FileNameExtensionFilter filter = new FileNameExtensionFilter(
       "Images", "jpg", "gif","png"); 
      FileNameExtensionFilter filter2 = new FileNameExtensionFilter(
        "Document", "docx", "doc","pdf","pptx"); 
      chooser.setFileFilter(filter); 
      chooser.setFileFilter(filter2); 
      Component parent = null; 
      int returnVal = chooser.showOpenDialog(parent); 
      if(returnVal == JFileChooser.APPROVE_OPTION) { 

       File filesend = new File(chooser.getSelectedFile().getPath()); 
       int count; 
       OutputStream out; 
       byte[] buffer = new byte[8192]; 
       try { 
        c.setMessage("fsendnow");// Sends a command to the server so it knows that im sending a file so it can prepare to receive it 
        c.msgOut(); 



        out = c.getMyClient().getOutputStream(); 
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(filesend)); 
        while ((count = in.read(buffer)) > 0) { 
         out.write(buffer, 0, count); 
         out.flush(); 
        } 

       }catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

そして、これはしかし、私はファイルを送信した後

}else if(line.equalsIgnoreCase("fsendnow")){ 

        byte[] buffer = new byte[8192]; 

        FileOutputStream fos = new FileOutputStream("a.png"); 
        BufferedOutputStream out2 = new BufferedOutputStream(fos); 

        int count; 
        InputStream in = client.getInputStream(); 
        while((count=in.read(buffer)) >=0){ 
         fos.write(buffer, 0, count); 
        } 
        fos.close(); 

        }else{ 
        cf.printMsg(client.getInetAddress().getHostAddress()+": "+line); 
       } 

が問題イムフェーシングが、それはフォルダに表示されないされたファイルを受信したコード、それとしてそれを開くことができませんイムです現在使用中です。私の推測では、実行中のプログラムはまだバイトを書き込んでいるということです。このソケットはまだ "使用されている"ため、私はプログラムで何もできません(メッセージ/その他のファイルを送信します)。私はここでソケットを閉じようとしましたが、私はチャットウィンドウを終了するまでメッセージを送信する必要があります。私は何をすべきか?私は新しいソケット接続を開く必要がありますか?私は本当にこれをやりたいとは思っていません。正直なところ、スレッド化されたサーバーを作成したくありません。

    while ((count = in.read(buffer)) > 0) { 
         out.write(buffer, 0, count); 
         out.flush(); 
        } 
        //c.getMyClient().close(); CLOSES THE SOCKET 
       }catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

どのように私はファイルを送信し、 "読み取り"からイメージを停止することをjavaに伝えますか?事前に申し訳ありません、その場合は、noob質問。

+0

あなたは最後にファイルを閉じていますか? –

+0

私は確信していませんが、私は読み取り(バッファ)呼び出しがスレッドをブロックし、ファイルへの出力ストリームが決して閉じられないと思います。これを解決するために –

+0

私は最初に、あなたはバイトの総数を受け取る必要があると思うと、反復の反復でインクリメントし、バイト数がファイルのバイトの総数に達するとループを中断します。 –

答えて

0

ソケットから8192バイトを読み込み、ファイルに8192バイトを書き込もうとしている可能性がありますが、ソケットから8192バイトよりも少ないバイトを受信する可能性があります。 8192バイトまでのファイルも

ファイルに書き込まれている、私は最初の8192のバイトを読むことを勧め、あなたがアルを持っているときは、常にオフセット0から足すされているので、バッファは、それを書く:

while ((count = in.read(buffer)) > 0) { 
        out.write(buffer, 0, count); 
        out.flush(); 
       } 
関連する問題