2012-01-24 18 views
0

私はJavaソケットプログラミングを初めて使い、現在ソケットAPIを探っています。 ServerSocketを起動してクライアントを待ち受ける新しいシンプルなAppを作成しました。クライアントがソケットに何かを書き込むと、サーバーはそのクライアントの新しいスレッドを割り当てます。私はコンソールアプリケーションを使用して最初に試して、すべてうまくいきました。今、私はSWT(Eclipse 3.7のWindowBuilderプラグイン)を使用して同じものに対してGUIを作っています。ウィンドウには、サーバーのリスニングをオン/オフするトグルボタンがあります。以下は、SWT Buttonのclickイベントで記述されたコードで、クライアントのリスニングを開始します。UI SWTをUI用に使用するシンプルソケット(Java)アプリケーションでフリーズ

if(!isServerRunning) 
{ 
    btnServerRunner.setText("Stop Server"); 
    isServerRunning = true; 
    while (listening) 
    { 
     try 
     { 
      new ClientHandler(listener.accept()).start(); 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 
else 
{ 
    try 
    { 
     listener.close(); 
    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
    btnServerRunner.setText("Start Server"); 
    isServerRunning = false; 
} 

ClientHandlerクラスがThreadは拡張していますので、すべての新しいクライアントのための新しいスレッドを起動します。上記のコードはコンソールアプリケーションでは動作しますが、ボタンのクリックでクライアントソケットをリッスンする無限ループにアプリを投げているので、GUIでは機能しません。をアプリのUIをフリーズしていないクライアントをリッスンするために開始して停止するエレガントな方法は何ですか?

ありがとうございました。

答えて

1

(UIディスパッチスレッドからの)別のスレッドでサーバーを実行する必要があります。

2

クライアント接続を受け入れるには、別のスレッドを使用する必要があります。ボタンはそのスレッドを開始して中断することができます。

関連する問題