我在服务器内为我的系统创建了一个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"));
答案 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实例列表以通知所有客户端。