2017-07-08 13 views
0

私はこの単純なマルチスレッドJavaソケットアプリケーションを持っています。その後、クラスClient.javaシンプルなJavaマルチスレッドソケットアプリケーション

public class Client { 

private static Socket socket; 
private static boolean waitForServer = false; 
public static void main(String[] args) throws IOException { 
    while(true){ 
     socket = new Socket("localhost", ServerPortInfo.getPort()); 
     PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader bufferedReader = new java.io.BufferedReader(new InputStreamReader(System.in)); 

     while(true){ 
      PrintWriter.println(name + " Hello"); 
       waitForServer = true; 

      if (waitForServer){ 
       BufferedReader inputBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       String inputString = null; 
       while((inputString = inputBufferedReader.readLine()) != null){ 
        System.out.println(inputString); 
        break; 
       } 

      } 

     } 

    } 
    } 
} 

そしてServer.java

および接続...

public class ServerThread extends Thread { 

private static Socket socket; 
public static boolean alive = true; 

ServerThread(Socket socket){ 
    this.socket = socket; 
} 

public void run(){ 
    if (alive) { 
     //DO STUFF NOW 
}  

} 

そして今、私は複数の接続を持っていることを扱うスレッドを使用します。接続ごとに異なるThreadを作成します。 ユーザーがこのサーバーから切断したい場合はどうすればよいですか?

スレッド、ソケットを殺すべきですか?

スレッド alive = false;にちょうど言ってみましたので、実行が停止します。しかし、これは他の接続も破壊します。

EDIT

ServerThread - >

private Socket socket; 

と機能 - 魔法のように>

void closeConnection() throws IOException{ 
    this.socket.close(); 
} 

作品。

+1

ソケットを閉じて、スレッドを強制終了します。 – frozen

+0

このプログラムの目的は何ですか?宿題? –

+1

'public static'変数は、災害のためのレシピです(私はあなたがちょうど難しい方法を見つけたと確信しています)。しかし、@cktangが言ったように、ソケットを閉じてから、そのスレッド(他のスレッドではない)をkillします。 –

答えて

1

パブリック静的変数は、災害のためのレシピです(確かに、難しい方法を見つけたばかりの です)。しかし、@cktangが言ったように、ソケットを閉じると、 はそのスレッド(他のスレッドではない)を強制終了します。 - @ JoeC

変更されたprivate static Socket socket;~private Socket socket;。 ソケットを閉じてからスレッドを閉じます。

0

問題は、それが静的であるため、それはすべてあなたのServerThread年代に影響を与えるが、各ServerThread(別名接続されたクライアント)

public static boolean alive = true; 
private static Socket socket; 

である、独自のソケットと旗を持っている必要があり、それが生きているかどうかを示します。

両方の属性からstatic修飾子を削除し 、スレッドを停止する(そしてリストから削除)ソケットを閉じまずフラグ
private volatile boolean alive = true;

を行います。

関連する問題