0

次のコードを含む class1 というクラスがあります。

public class class1 {
    public static ServerSocket serverSocket;

     public static void main(String args[]) {        
        try {
            serverSocket = new ServerSocket(1234);
            while (true) {
                class2 t = new class2(serverSocket.accept());
                t.start();
            }
        } catch (IOException ex) {
            Logger.getLogger(LisenerServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

クラス 1 では、接続ごとに新しいスレッドを開きます。

そして、次のコードを持つ class2 という別のクラスがあります。

public class class2 extends Thread {
    private Socket socket;

    public class2(Socket socket) {
        try {
            this.socket = socket;
            in = new BufferedInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());
        } catch (IOException ex) {
            Logger.getLogger(ListenerServerThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run() {
       while (true) {
           try {
               // do something with in and out.
           } catch (IOException ex) {
               System.out.println(ex);
               break;
           } 

       }
    }
}

クライアント (Java プログラムではない) がソケット サーバーに接続して sting コマンドを送信するようにしたいのですが、クライアント (クラス 1 で開かれたスレッド名および/または ID によってクライアントを識別します) が接続されているかどうかを知りたいです。 .

クライアントが接続されているかどうかを継続的に確認するために単一のスレッドを開く別のクラス、たとえばクラス 3 を作成できますか? もしよろしければ、例を教えていただけませんか?

4

1 に答える 1

1

接続されたクライアントのグローバルリストを保持できると私が理解したことによると、質問が正しかったことを願っています。たとえば、次のようになります。

List<class2> MyList;

class2 スレッドが開始されると、それ自体がリストに追加されます。

public class2(Socket socket) {
   try {
      this.socket = socket;
      in = new BufferedInputStream(socket.getInputStream());
      out = new DataOutputStream(socket.getOutputStream());
      MyList.add(this);
   }
   catch (IOException ex) 
   {
       Logger.getLogger(ListenerServerThread.class.getName()).log(Level.SEVERE, null, ex);
   }
}

スレッドが終了すると、リストから自身を削除します。

Try
{
   while (true) {
      try {
          // do something with in and out.
      } catch (IOException ex) {
         System.out.println(ex);
         break;
      } 
    }
} 
finally {
    for (int i=0; i < MyList.size(), i++)
       if (MyList.get(i) == this) 
       {
           MyList.delete(i);
           break;
       }
}

このようにして、スレッドを介して接続されたクライアントのリストを取得できます。class2 にいくつかのメソッドを追加して、ソケット、実行時間などの詳細情報にアクセスすることもできます。また、ミューテックスまたはその他の同期メソッドを使用して (追加/削除するときに) このリストにアクセスすることを検討する必要があります。 .

于 2013-06-05T21:02:07.753 に答える