2016-03-03 4 views
1

Мое приложение java, работает на сервере, открывает порт и подключается к устройствам через сокет. Все прогоняли до определенного момента, много соединений осталось в CLOSE_WAIT, даже если мое приложение завершит процесс в пакете, который я получаю.Netty socket generate Close_wait status

Что я заметил, так это то, что ЦП начал использовать двойной источник, открытый файл увеличивается, а число CLOSE_WAIT также увеличивается.

В проводной таблице пакет, отправленный с условием CLOSE_WAIT, мы видим, что сервер не отправил FIN клиенту.

PS: Я на убунту 14,04 испытанный сервер, я использую Нетти 3.10.1

Вот код, где я сделал Pipeline:

@Override 
public ChannelPipeline getPipeline() { 
    ChannelPipeline pipeline = Channels.pipeline(); 
    if (resetDelay != null) { 
     pipeline.addLast("idleHandler", new IdleStateHandler(GlobalTimer.getTimer(), resetDelay, 0, 0)); 
    } 
    pipeline.addLast("openHandler", new OpenChannelHandler(server)); 
    if (loggerEnabled) { 
     pipeline.addLast("logger", new StandardLoggingHandler()); 
    } 
    addSpecificHandlers(pipeline); 
    if (filterHandler != null) { 
     pipeline.addLast("filter", filterHandler); 
    } 
    if (reinitializeHandler != null) { 
     pipeline.addLast("reinitialize", reinitializeHandler); 
    } 
    if (refineHandler != null) { 
     pipeline.addLast("refine", refineHandler); 
    } 
    if (noFilterHandler != null) { 
     pipeline.addLast("nofilter", noFilterHandler); 
    } 
    if (specificFilterHandler != null) { 
     pipeline.addLast("specificfilter", specificFilterHandler); 
    } 
    if (reverseGeocoder != null) { 
     pipeline.addLast("geocoder", new ReverseGeocoderHandler(reverseGeocoder, processInvalidPositions)); 
    } 
    pipeline.addLast("handler", new TrackerEventHandler(dataManager)); 
    return pipeline; 
} 

ответ

0

CLOSE_WAIT означает, что ваша программа все еще работает , и не закрыл сокет (и ядро ​​ждет его для этого). Добавьте -p в netstat, чтобы получить pid, а затем убейте его более активно (при необходимости SIGKILL). Это должно избавиться от ваших сокетов CLOSE_WAIT. Вы также можете использовать ps для поиска pid.

SO_REUSEADDR для серверов и гнезд TIME_WAIT, поэтому здесь не применяется.

Обратитесь к this thread за другими отзывами.

Проверьте код приложения, чтобы убедиться, что вы явно закрываете все сокеты, созданные после завершения сеанса клиента.

+0

Приложение связывается с множеством устройств, так как я сказал, что все идет правильно до определенной точки, а это означает, что мое приложение закрыто. Также я не могу убить, потому что мое приложение взаимодействует с другим устройством, что сервер правильно закрывает соединение с ними. – EspritBat

+1

Можете ли вы поделиться фрагментами своего кода, который отвечает за обработку клиентов? – Learner

+1

У нас нет клиентского кода, потому что он обрабатывается устройством (GPS), у которого есть программа, сделанная нашим провайдером. Но мы знаем, что проблема исходила от нашего сервера, который SOMETIMES не закрыл соединение (по Netty) – EspritBat

0

Ваше приложение просачивает розетки, не закрывая их. Так что закройте их. Все они. В конце блоков. Когда вы читаете конец потока или получаете IOException operatng на сокете.

Смежные вопросы