2017-09-15 41 views
1

クライアントとサーバーがあり、クライアントがimgファイルをサーバーに送信するプログラムを作成しています。以下のコードは、最後の実行時にブロックされているobIn.readのループ中にスタックされているサーバのためのコードです。したがって、-1を返してループを破ることはできません。それは私のクライアントのためのループを壊すことはありません。だから私はクライアント上のループの後にそれをフラッシュしようとしたが、それは良いことをするように見えない。私はobOutを閉じたいとは思わない。なぜなら、それは私が開いたままにしたいソケットを閉じるからだ。サーバー側はobIn(インスタンス変数である入力ストリーム)からビットを受け取り、作成したファイルに書き込みます。ファイルを送信するサーバーとクライアントJava

    //server receives file 
        File file = new File("image/image.png"); 
        BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream(file)); 
        byte[] bytes = new byte[1000]; 
        int c = 0; 
        while((c = obIn.read(bytes)) != -1) { 
         fileOut.write(bytes, 0, c); 
         fileOut.flush(); 
         System.out.println(c); 
        } 
        System.out.println(c); 
        fileOut.close(); 
        System.out.println("File Created"); 

   //Client 
       String imgPath = in.nextLine(); 
       File file = new File(imgPath); 

       BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream(file)); 
       byte[] bytes = new byte[1000]; 
       int c = 0; 
       while((c = fileIn.read(bytes)) != -1) { 
        obOut.write(bytes, 0, c); 
        obOut.flush(); 
        System.out.println(c); 
       } 
       obOut.write(bytes, 0, 1000); 
       obOut.flush(); 
       System.out.println(c); 
       fileIn.close(); 
       System.out.println("File Sent"); 

この画像は、サーバーが上にあり、クライアントが下部にある出力です。それが、サーバーがブロックされていることがわかったところです。

enter image description here

Here私はこの方法を発見し、それは私のセットアップのために働く作ってみましたところです。これは私のストリームでの作業です。あなたのクライアントクラスで

+1

とwhileループの側面をwriteflush機能を交換してみてください。それをやりたくない場合は、たくさんのファイルを送信したいと思うので、あなた自身の*プロトコル*(クライアントとサーバーの間で話す規則)を作成する必要があります。そのようなプロトコルでは、最初にサーバに何バイト(ファイルの長さ)を期待しているのかを知らせて、-1を待つのではなく、何バイトが到着したのかを数えているだけで、 、(別のファイルを受け取るなどの)処理すべき他のタスクに関する情報を待つ。 – Pshemo

答えて

0

あなたは()ライター(ここでは `obOut`)を閉鎖する必要が-1``送信するにはobOut.close();

関連する問題