2011-06-27 1 views
0

簡単なダウンロードアクセラレータを作成したい。それは着信接続のためのJava Client/Serverマルチスレッドによるファイル転送の問題

  1. サーバー待ちの仕組み

  2. クライアントがサーバーに接続しています。
  3. 次に、サーバーはファイルサイズをクライアントに送信し、ダウンロード接続を待ちます。
  4. 次に、クライアントは、サーバーに接続され、ダウンロードスレッドとこれらのスレッドを作成し、ファイルサイズを得ました。
  5. サーバは、各スレッドからの接続を得た後、サーバーは開始を待つスレッドからファイルオフセットを終了します。
  6. 各スレッドは、開始オフセットファイルと終了オフセットファイルをサーバーに送信します。
  7. サーバがオフセットを取得した後、サーバはファイルの一部をスレッドに送信します。
  8. 各スレッドはファイルを読み書きします。例えば、buffer.p01、buffer.p02は、buffer.p03
  9. クライアントは、シーケンスにより、一つのファイルのためにすべてのファイルをマージします。 (まだを実装されていない)

私は、サーバー側は、それが正常に動作しますが、クライアント側は、それはいくつかの問題があると思います。

問題は、私が1にMAXTHREADを設定した場合、それが正しく動作しています。しかし、私が複数を設定すると、それはどこかで永遠に詰まった。

これは、サーバー側のコード..です http://pastebin.com/TEakGB0c

、これはあなたの http://pastebin.com/wKhP7DxS

感謝をマルチスレッドでクライアント側のコードです。

+0

は、デッドロックの問題のように聞こえます。どんなコードもなければ、本当に助けることはできませんか? –

+0

私はすでに質問の最後にコードを掲載しています。あなたは見えますか? –

+0

ああ、私は今それを見る。見せて。 –

答えて

1

あなたはかなり大きな明白な問題を抱えています。 ServerSocketのacceptメソッドは毎回新しいソケットを返します。ここのサーバーコードで

initSocket = servSock.accept(); 

initSocketは、古いソケットを上書きし、決して閉じないことを意味するクラスメンバフィールドです。あなたはこのソケットを扱うために新しいスレッドを開始し、同じソケットを再利用し続けるように見えます。それは動作しません。ソケットを開く方法に関するチュートリアルを見てください。申し訳ありませんが、私はもっと助けることはできませんが、ちょうどうまくいかないことがたくさんあります。おそらく、コードの一部に焦点を当て始めることができ、もっと助けることができます。

0

私は同意します、それは小さな問題であるか、または大きなものになる可能性があります。あなたが援助するのに役立ついくつかのコード例同じポートを使用して3回サーバーに接続しようとすると、あなたはあなたのポストを編集し、あなたのコードを追加し、我々はより良​​いあなたを助けることができる場合、ポートごとに1つの接続を持つことができます、問題は非常に単純または非常に複雑になる可能性があります。

0
Please close your OutputStream os 

Sending u a snippet 


public static boolean sendFile() { 
     int start = Integer.parseInt(startAndEnd[0]) - 1; 
     int end = Integer.parseInt(startAndEnd[1]) - 1; 
     int size = (end - start) + 1; 
     try { 
      os = initSocket.getOutputStream(); 
      os.write(byteArr, start, size); 
      os.flush(); 
      System.out.println("Send file to : " + initSocket); 
     } catch (IOException e) { 
      System.out.println(e.getLocalizedMessage()); 
      disconnected(); 
      return false; 
     } finally { 
      if (os != null) { 
       try { 
        os.close(); 
       } catch (IOException ex) { 
        Logger.getLogger(FileServer.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     } 
     return true; 
    } 
関連する問題