2011-06-22 15 views
0

私のコードでは、スレッドが既存の接続を処理してclose()を呼び出すまで、serverSocketは新しい接続を受け付けません。 serverSocket.accept()が作成したソケット上にあります。このサーバーを起動してブラウザで2つのタブを開くと、タブの1つのみが接続され、もう1つは、serverSocket.accept()が新しい接続を受け入れる前に、もう一方のタブが終了するまで待機します。前の接続を閉じずに新しい接続を受け入れる方法はありますか?JavaServerSocketは、受け入れられたソケットでclose()が呼び出されるまで新しい接続を受け付けません

public class ReboundServer { 

    static ServerSocket serverSocket; 
    public static boolean listening = true; 

    /** 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws IOException {  
     try { 
      serverSocket = new ServerSocket(4444); 

      System.out.println("Starting Server"); 
     } catch (IOException e) { 
      System.out.println("Could not listen on port: 4444"); 
      System.exit(-1); 
     }  

     while(listening) 
     { 
      (new Thread(new ClientThread(serverSocket.accept()))).start(); 
     } 

     serverSocket.close(); 
    } 
} 


public class ClientThread implements Runnable { 
    private Socket clientSocket = null; 

    public ClientThread(Socket socket) 
    { 
     this.clientSocket = socket; 
    } 

    public void run() 
    { 
     System.out.println("ClientConnected"); 
     MatchThread.QueueLock.lock(); 
     MatchThread.connectionQueue.add(clientSocket); 
     MatchThread.QueueLock.unlock(); 

    } 
} 
+2

あなたのサーバーの 'accept()'ループがうまく見えます。あなたが記述する振る舞いは、このコードの期待される動作ではありません。あなたが見たいはずのものです。おそらく、あなたが私たちに示していない他のコードにボトルネックがありますか? –

+0

さて、あなたのコードをエディタに貼り付けて、MatchThread.xxx呼び出しブロックを単純無限ループに置き換えました(スレッドの終わりのように)。あなたが期待している通りに動作します。サーバ。そのため、MatchThreadに問題がある可能性があります(可能性は低いですが)、環境に問題がある可能性があります。あなたはどのOSで作業していますか? Sun JDKまたはOpenJDK、または他のJREを使用していますか? – Crollster

+0

ああ、私はそれが問題を引き起こしている私の環境かもしれないと非常に思った。テストのためにどうもありがとうございます。私はそれが別のマシンで動作するかどうかを見に行くつもりです。 – ntkachov

答えて

0

明らかな問題はここではないですが、そのコードが、あなたが投稿していないMatchThreadクラスインチそのキューを処理するスレッドが1つあるようです。どうして?

+0

すべてのスレッドは2つのクライアントを一致させ、それらを一緒に接続します(現在2つ以上のクライアントを待ってスピンし、両方を閉じます) – ntkachov

+0

@ntkachovそれで問題をデバッグするのに十分なことはありませんか?たとえば、「一緒に接続する」ということはどういう意味ですか? – EJP

関連する問題