2012-03-16 5 views
0

ソケットTCP/IPとGUIを使用するJavaアプリケーションがあります。サーバーは常に接続をリッスンし、クライアントからのメッセージを受信します。サーバーがメッセージを受信すると、スイングフォームが表示されます。 閉じるボタンをクリックすると問題が発生しますが、サーバーソケットを常に設定していますが、アプリケーションは停止します(メソッドserverSocket.accept()をループwhile(true)に入れて接続します)。 どうすれば問題を解決できますか?ここでネットワークスレッドとスイングスレッドの問題

は、サーバー上の私のコードです: パブリッククラスTCPServerの{

ServerSocket server = null; 
BufferedReader in; 
PrintWriter out; 
Socket client = null; 

//open serverSocket 
public void openServer() { 
    try { 
     server = new ServerSocket(1234); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

//accept connection and read data 
public void listening() { 
    try { 

     while (true) { 
      client = server.accept(); 
      in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      out = new PrintWriter(client.getOutputStream(), true); 
      //read data from stream 
      String s = in.readLine(); 
      System.out.println("String receive: " + s); 

      new NewJFrame().setVisible(true); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void closeServer() { 
    try { 
     if (out != null) { 
      out.close(); 
     } 

     if (in != null) { 
      in.close(); 
     } 
     if (client != null) { 
      client.close(); 
     } 
     if (server != null) { 
      server.close(); 
     } 
    } catch (Exception e) { 
    } 
} 

public static void main(String arg[]) { 
    TCPServer server = new TCPServer(); 
    server.openServer(); 
    server.listening(); 
    server.closeServer(); 
} 

}

+0

はクローズイベント – Blitzkr1eg

+0

を処理するコードは、あなたが私たちにNewJFrameコードを表示することができます示して?閉じるボタンが押されたときに 'System.Exit'をやっていないのですか?スタックトレースを取得しますか? – GETah

+0

閉じるボタンがウィンドウに表示されます。私は次のように設定します:setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); – PhiVH

答えて

4

 EXIT_ON_CLOSE 
     The exit application default window close operation. 

NewJFrameのクラスでは、これを削除します。setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

閉じるボタンがヒットしたとき、これはアプリケーション全体のシャットダウンを作っています!

ことによってそれを置き換えます。 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

あなただけのウィンドウが配置されていることを確認している。この方法は、全体ではなくアプリケーション

+0

ああ、ありがとうございます。今、あなたのアイデアは素晴らしいです。私は私の問題を解決しました。 – PhiVH

+0

@PhiVHあなたが問題を解決した場合、これを答えとしてマークしてください:) – GETah

+0

@PhiVH、答えがあなたの問題を解決したら、答えを受け入れるために "チェックマーク"をクリックする必要があります。 –

1

私たちはあなたのダイアログが "CLOSE_ON_EXIT" オプションは、それが「にSystem.exit(呼び出すことOT設定したことを推測することはでき)" 直接?

そうでない場合は、詳細をお知らせください。 Javadocから

+0

ありがとう、私の質問に答えて、私は私の問題を解決しました。 – PhiVH

関連する問題