Мне интересно, как ограничить TCP-запросы на каждого клиента (на определенный IP) в Java. Например, я хотел бы разрешить максимум X-запросов за Y секунд для каждого IP-адреса клиента. Я думал об использовании статического таймера/TimerTask в сочетании с HashSet временных ограниченных IP-адресов.Ограничить TCP-запросы на IP
private static final Set<InetAddress> restrictedIPs = Collections.synchronizedSet(new HashSet<InetAddress>());
private static final Timer restrictTimer = new Timer();
Таким образом, когда пользователь подключается к серверу, я добавляю его IP в ограниченный список, и начать задание unrestrict его через несколько секунд.
restrictedIPs.add(socket.getInetAddress());
restrictTimer.schedule(new TimerTask()
{
public void run()
{
restrictedIPs.remove(socket.getInetAddress());
}
}, MIN_REQUEST_INTERVAL);
Моя проблема заключается в том, что в то время, когда задача будет выполняться, то объект сокет может быть закрыт, и удаленный IP-адрес не будет доступен больше ...
Любые идеи приветствуются! Кроме того, если кто-то знает Java-framework-встроенный способ достичь этого, я бы очень хотел его услышать.
Спасибо за ваш ответ! Я, вероятно, сделаю карту, как вы сказали. – asmo
Как раз по проблеме с этим решением: как определить, когда удалять IP-адреса с карты? Потому что, если сервер будет работать в течение длительного времени, он будет иметь карту из тысяч IP-адресов. – asmo
Пару тысяч не должно быть проблемой, но я понимаю вашу озабоченность. Вы можете запланировать очистку, которая будет выполняться каждый час или около того, чтобы удалить все старые IP-адреса (например, старше часа). – Marc