在客户端断开连接后,如何从服务器中删除客户端用户名?

时间:2016-07-16 13:45:13

标签: java sockets server client

我在服务器内为我的系统创建了一个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"));

1 个答案:

答案 0 :(得分:1)

Andrey是正确的,您需要检测套接字关闭。但是您需要为代码添加更多逻辑。

我希望ClientHandler.start()启动一个新线程,该线程具有循环和从/向客户端读/写数据。套接字关闭检测可能会在此线程中实现。 ClientHandler不知道发起连接的用户用户。因此,代码可能会稍微改变一下,以使ClientHandler了解用户。

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

或者更好 - 在ClientHandler中读取userName

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

您将需要一个用于同步的用户存储类,以便允许从多个ClientHandler实例进行安全访问。当ClientHandler检测到断开连接时,它可以轻松地从存储中删除用户名并启动触发用户。

不是您不仅需要在用户存储中存储名称,因为您需要通知所有客户端连接丢失,因此您需要存储活动ClientHandler实例列表以通知所有客户端。