Java SocketException: нет свободного места в буфере - PullRequest
4 голосов
/ 15 июня 2011

Мой Java-код использует несколько потоков, каждый из которых запускает ServerSocket и входит в accept. Эти потоки общаются друг с другом, используя сокет Java. С 121 потоком все работает хорошо, но если я запускаю тот же код с 256 потоком, у меня появляется эта ошибка:

java.net.SocketException: No buffer space available (maximum connections reached?): listen failed
    at java.net.PlainSocketImpl.socketListen(Native Method)
    at java.net.PlainSocketImpl.listen(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)

Я использую windows xp sp3, есть несколько таких сообщений ( здесь ), но никто не публикует решение этой проблемы. Я также установил патч Windows для снятия ограничения на TCP-соединение, но я не решил мою проблему.

Ответы [ 4 ]

5 голосов
/ 16 июня 2011

В сообщении говорится, что у вас не хватает соединений. Вы это проверяли? Вы можете проверить открытые сокеты из командной строки, используя:

netstat -n

Убедитесь, что вы закрываете все гнезда с обеих сторон (в окончательных блоках). Помните, что прослушивающие сокеты остаются открытыми после получения соединения. Не открывайте и не закрывайте сокеты слишком быстро (я бы сказал, что их нельзя сразу использовать повторно, что может быть связано с вашей проблемой).

Для повышения производительности, связанной с сокетами, вы можете использовать API java.nio, но это намного сложнее, чем java.net.

3 голосов
/ 15 июня 2011

Это сообщение Я думаю, что может быть ваш ответ. Если оставить висящие сокеты, вы достигнете максимума (что может быть обусловлено некоторыми другими настройками, которые исправление Windows не исправляет (например, предел JVM?)

В качестве примечания: если вы работаете с таким количеством потоков, весьма вероятно, что вам лучше использовать java.nio, а не простые классы java Socket и ServerSocket.

Этот сайт является очень хорошим руководством по использованию java.nio и тому, как я его изучил (наряду с изучением API Java / NIO Sun / Oracle ), полученным из используя простое программирование Socket и ServerSocket.

В частности, что поможет вашему делу, это использование Selector, который позволит вам мультиплексировать ваш сокет-ввод-вывод так же, как вызов C ++ select () работает с сокетами. Это означает, что в основе кода вашего сокета вы можете уменьшить влияние наличия большого количества потоков, связанных с вводом-выводом сокета, и иметь только один поток, взаимодействующий напрямую с сокетами.

1 голос
/ 22 февраля 2017

Незнание того, что вы конкретно делаете, делает это лишь предположение, но я предложу это в случае, если кто-то еще увидит подобную проблему.Я видел эту ошибку при попытке открыть слишком много ВЫХОДНЫХ соединений.Уменьшая размер буфера, вы ограничили количество соединений, открытых вашими связующими потоками (они будут отклонены, когда вы достигнете лимита буфера).Если вы все еще получаете адекватную пропускную способность, это прекрасное решение.Однако другим решением является увеличение количества доступных исходящих соединений, что может решить вашу проблему и обеспечить лучшую пропускную способность.

Для этого вы можете добавить / изменить запись реестра для MaxUserPort.Используя regedit, найдите HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ Tcpip \ Parameters, затем добавьте ключ / mod: MaxUserPort для ввода DWORD и высокого значения, например 65534 (десятичное число)

Существует техническая статья usoft о MaxuserPort.

1 голос
/ 16 июня 2011

Я решил проблему путем изменения вызова ServerSocket.Моя ошибка - установить слишком большое значение невыполненного задания.Мне не нужно, чтобы сервер прослушивал более 5-6 соединений.Я заменил: ServerSocket Sock = новый ServerSocket (порт, 500);с ServerSocket sock = новый ServerSocket (порт, 10);И теперь все хорошо работает!

...