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

标签 java sockets server client

我在我的系统的服务器中创建了一个数组列表,其中存储每个用户的名称。这是在客户端中输入的,然后通过打印机发送到服务器。但是,我希望当客户端与套接字断开连接时更新此列表,并删除他们输入的用户名。更新后的用户名列表必须显示在现有客户端和服务器上。

服务器:

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"));

最佳答案

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

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

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

或者也许更好 - 在 ClientHandler 中读取用户名

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

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

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

关于java - 客户端断开连接后,如何从服务器中删除客户端用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38411847/

相关文章:

java - 如何删除写入文件的对象?

java - Android android.intent.action.SEND youtube 视频

file - fflush() 有时会阻塞超过 1 秒

java - 在互联网上使用程序时,ObjectInputStream$BlockDataInputStream.peekByte

java - getClassLoader().getResource(filepath) 返回空指针

java - AngularJS Java 身份验证和 $scope

C++停止CAsyncSocket将单个大数据包拆分为多个小数据包

iOS 下载图片大小

java - Socket OutputStream(BufferedWriter) 不刷新消息

sockets - Ada 和 Python 之间的 TCP 套接字