2016-07-16 2 views
0

各ユーザの名前を格納する私のシステムのサーバ内にarraylistを作成しました。これはクライアントに入力され、プリントライターを介してサーバーに送信されます。しかし、クライアントがソケットから切断して、入力したユーザー名を削除すると、このリストが更新されます。更新されたユーザー名リストは、既存のクライアントとサーバーの両方に表示する必要があります。クライアントが切断された後、クライアントのユーザー名をサーバーから削除するにはどうすればよいですか?

サーバー:

do 
     { 
      //Wait for client. 
      client = serverSocket.accept(); 
      in = new BufferedReader(
        new InputStreamReader(client.getInputStream())); 
      out = new PrintWriter(
        client.getOutputStream(),true); 
      userNames.add(in.readLine()); //Adds to the userNames array based read in from the client 
      System.out.println("---User List---"); 
      for(int size = 0; size < userNames.size(); size++) 
      { 
       System.out.println(userNames.get(size)); 
      } 
      out.println("Welcome, the following users are connected..."); 
      out.println(userNames); 
      handler = new ClientHandler(client); 
      handler.start(); 
     }while (true); 

クライアント:

do 
     { 
      System.out.print("Please enter a username:"); 
      Users user = new Users(keyboard.nextLine()); 
      output.println(user.username); 
      System.out.println(in.readLine() + "\n"); 
      System.out.println(in.readLine()); 
      System.out.print("\nEnter message ('QUIT' to exit): "); 
      message = keyboard.nextLine(); 
      output.println(message); 
      if (!message.equals("QUIT")) 
      { 
       response = networkInput.nextLine(); 
       System.out.println("\n" + response); 
       output.println(user.username); 
      } 
     }while (!message.equals("QUIT")); 
+2

このケースでは、サーバーでソケットクロージャを検出し、反応を追加する必要があります。見てくださいhttp://stackoverflow.com/questions/10240694/java-socket-api-how-to-tell-if-a-connection-has-been-closed –

+0

それは本当に役立つことはありません。私はクライアントが接続を閉じた後、サーバーにある配列リストからユーザー名を削除することを知る必要があります。 **一度に複数のクライアントを接続することができます。 – DaveDavidson

答えて

1

アンドレイが正しい、あなたはソケットの閉鎖を検出する必要があります。しかし、コードに少し多くのロジックを追加する必要があります。

ClientHandler.start()はループを持ち、クライアントとの間でデータを読み書きすることを期待しています。このスレッドでは、ソケットクローズ検出が実装されている可能性があります。 ClientHandlerは、接続を開始したユーザー・ユーザーを認識しません。したがって、ClientHandlerがユーザーを認識できるように、コードが少し変更される可能性があります。

String userName = in.readLine(); 
userNames.add(userName); 
handler = new ClientHandler(client, userName); 
handler.start(); 

または、おそらくより良い - あなたはそれが複数ClientHandlerのインスタンスからの安全なアクセスを可能にするように、同期されますユーザーのストレージのためのクラスが必要になりますClientHandlerの

handler = new ClientHandler(serverSocket.accept()); 
... 
ClientHandler(ServerSocket s) { 
    // get stream and read username here 
    // add username to list 

をユーザー名をお読みください。 ClientHandlerが接続解除を検出すると、ストレージからユーザー名が簡単に削除され、ユーザーの起動が開始されます。

すべてのクライアントに通知する必要があるため、アクティブなClientHandlerインスタンスのリストを保存する必要があるため、すべてのクライアントにすべてのクライアントに通知する必要があるため、ユーザーストレージに名前だけでなく、

関連する問題