Соединения сокетов в Java не ограничивают [дубликаты]

Я все еще плохо знаком с 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 не отклоняются, когда резерв заполнен? )


Есть идеи?

10000