import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class FTPLimitLogin {
private boolean isConnected = false; // 标识位,表示是否有用户连接
private String connectedUser; // 记录连接的用户
private String connectedIP; // 记录连接的 IP
private ConcurrentHashMap<String, Long> lastActivityTimes = new ConcurrentHashMap<>(); // 存储用户最后活动时间
private ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
public boolean checkLogin(String userName, String ip) {
if (isConnected &&!connectedUser.equals(userName) &&!connectedIP.equals(ip)) {
return false; // 已有其他用户连接,登录失败
}
if (isConnected && connectedUser.equals(userName) && connectedIP.equals(ip)) {
// 如果是相同用户和相同 IP 重新登录,更新最后活动时间
lastActivityTimes.put(userName, System.currentTimeMillis());
return true;
}
isConnected = true;
connectedUser = userName;
connectedIP = ip;
lastActivityTimes.put(userName, System.currentTimeMillis()); // 记录登录时间
return true; // 登录成功
}
public void logout(String userName) {
if (connectedUser.equals(userName)) {
isConnected = false;
connectedUser = null;
connectedIP = null;
lastActivityTimes.remove(userName); // 移除用户的最后活动时间记录
}
}
public void markActivity(String userName) {
lastActivityTimes.put(userName, System.currentTimeMillis()); // 更新用户的最后活动时间
}
public void startWatchdog() {
executorService.scheduleAtFixedRate(() -> {
if (isConnected) { // 如果有用户连接
long currentTime = System.currentTimeMillis();
long lastActivityTime = lastActivityTimes.get(connectedUser);
if (currentTime - lastActivityTime > 30000) { // 30 秒内无活动
logout(connectedUser); // 自动注销
System.out.println(connectedUser + " 因超时被自动注销。");
}
}
}, 30, 30, TimeUnit.SECONDS);
}
public static void main(String[] args) {
FTPLimitLogin ftpLimitLogin = new FTPLimitLogin();
ftpLimitLogin.startWatchdog();
// 用户 1 尝试登录
String userName1 = "user1";
String ip1 = "192.168.1.1";
boolean canLogin1 = ftpLimitLogin.checkLogin(userName1, ip1);
if (canLogin1) {
System.out.println("user1 登录成功");
// 模拟用户 1 活动
ftpLimitLogin.markActivity(userName1);
} else {
System.out.println("user1 登录失败,已有用户连接");
}
// 一段时间没有活动
try {
Thread.sleep(35000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 用户 2 尝试登录
String userName2 = "user2";
String ip2 = "192.168.1.2";
boolean canLogin2 = ftpLimitLogin.checkLogin(userName2, ip2);
if (canLogin2) {
System.out.println("user2 登录成功");
} else {
System.out.println("user2 登录失败,已有用户连接");
}
}
}