Я все еще плохо знаком с Java и сокетами. У меня есть программа, которая прослушивает соединения и, если она входит, отправляет ее в класс, который обрабатывает соединение и использует ExecutorService
для запуска потока обработки.
Я хочу ограничить количество соединений, поэтому я обнаружил, что сокет имеет параметр для этого. Это основной код:
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(123, 1);
try {
ConnectionListener listener = new ConnectionListener(server);
listener.run();
}
catch (Exception exception) {
exception.printStackTrace();
}
}
В этом примере я хотел ограничить количество подключений до 1. Я пытался засыпать его множеством параллельных исполнений скрипта python, который отправляет данные на этот порт. Но я никогда не получаю «отказано в соединении» или явную задержку соединения, как будто ограничение не соблюдается.
Что я делаю неправильно?
Всего 2 ответа
Аргумент backlog
не ограничивает количество соединений, которые будет иметь ваша программа.
Аргумент backlog определяет, сколько неподдерживаемых соединений может поддерживать ваш сервер. Если у вас есть резерв 1 и клиент подключен к вашему серверу, принятие первого соединения позволит принять другие соединения. Однако, если вы не примете первое соединение, всем будущим клиентам, подключающимся к серверу, будет отказано.
Задержка 2 будет поддерживать два неприемлемых соединения и отклонять третье соединение.
Это поведение может отличаться в зависимости от вашей платформы. Для получения дополнительной информации ознакомьтесь с ответом на вопрос: почему соединения ServerSocket не отклоняются при заполнении журнала невыполненных работ?
Пользователь, ответивший на этот вопрос, является профессионалом в области сетевых технологий и имеет больше контента, связанного с сокетами сервера Java, если вы заинтересованы в дальнейшем ознакомлении с вопросами и ответами, связанными с сокетами сервера в Java † .
† Хотя не все эти сообщения имеют непосредственное отношение к сокету сервера (некоторые могут вообще не относиться к делу из-за плохой стратегии тегирования), я настоятельно рекомендую проверить их в свободное время - вы можете узнать что-то, что поможет вам в будущем проблемы.
Вы можете просто закрыть ServerSocket после того, как вы примете одно соединение. Это будет работать для вас.
И чтобы получить более полное представление об этой проблеме, вы можете обратиться к ответу ( Почему соединения ServerSocket не отклоняются, когда резерв заполнен? )