Здравствуйте!
Имеется проблема, которая уже вынесла мне весь мозг..
Суть в следующем: когда мое приложение на java 8 запускается оно сразу же создает 800 подключений на удаленный сервер(к нему доступа нет), в новых потоках - потоки создаются нормально, подключения тоже все подключаются (метод connect не выбрасывает исключений никаких).
Комманда netstat | grep 4444 | grep ESTABLISHED | wc -l выводит 800(т.е. все соеденения успешно установлены).
В новом потоке в цикле вызывается блокирующий read, который ждет пакет такого типа:
*длина данных* *данные соб-сно*
.
Теперь проблема:
Не во все подключения приходят ответы с сервера.
Схема взаимодействия клиента с сервером: клиент шлет пакет 42 байта на серв, серв отвечает 1502 байта.
На практике, все пакеты из клиента ушли(вероятно, т.к. write не выбросил IOException), но ответы пришли в лучшем случае в 500 подключениях, остальные повидимому заблочились на read..
Как это можно отдебажить? Пните в нужную сторону плиз..
Или возможно подскажите, какие опции сокету поставить, чтобы был ответ.
П.с. к удаленному хосту доступа не имею. Могу дебажить только от клиента...
Заранее спасибо за ответы!!
Потоки в java создаются, на jvm 8 гб ОЗУ выставлено, тут все ок.
Подключения тоже установлены - все, через netstat это видно (везде ESTABLISHED)...
но вот ответа нет..
=======================================++
!!!!!!!!!!!!!!!!! Важно, когда возникает баг:
Запустил 1 раз - все потоки стартанули и подключения подключились, завершил приложение - все подключения перешли в WAIT_TIME.
Опять запускаю - работает половина.
Жду пока уйдут все подключения с WAIT TIME, запускаю - работает)
Короче ошибка возникает из-за tcp previous segment not captured и out-of-order , кто знает как пофиксить:?
Илья: получается такая фишка:
запустил 1 раз 100 клиентов, создалось 200 подключений - все удачно, успешно нормально работет. Как и ожидается.
запустил 2 раз: тоже 100 клиентов, тоже 200 соеденений, все подключились, пакеты 42 байта ушли в том количестве, в котором нужно. НО! с сервака сразу приходят пакеты RST в кол-ве 50 штук и затем FIN -> ACK....
Это антиддос режет или файрвол, у меня режет или на сервере??
Илья: а что там можно криво реализовать? Все как надо..
Пробовал даже такое: перед конектом слип в 1 сек, после конекта слип,
шлю данные, слип, звоню available на input stream, там пусто(
Если заюзать nio проблема отпадет? или нет?