Сокет не закрывается при вызове socket.close () - PullRequest
2 голосов
/ 12 октября 2010

Я нашел ту же проблему в этом посте , но я думаю, что она не была решена.

Я собираюсь быть кратким, это мой код:

try {
Socket pacConx = new Socket(ip, Integer.parseInt(port));
DataInputStream  dataIn = new DataInputStream(pacConx.getInputStream());
DataOutputStream dataOut = new DataOutputStream(pacConx.getOutputStream());

while(){...}
} catch (IOException e) {
    logger.fatal("error", e);
}finally{
    if (dataIn != null) {
           dataIn.close();
     }
     if (dataOut != null) {
            dataOut.close();
     }
      if (pacConx != null) {
            pacConx.close();
      }
}

Сначала я подключаюсь к серверу, используя приведенный выше код, и это успешно.Но, когда я пытаюсь через некоторое время повторно подключиться к тому же серверу и порту, я не могу повторно подключиться.Очевидно, первый сокет все еще «жив» в serverSide.

- это решение моей проблемы?

Есть ли способ, которым я могу закрыть другой «живой» сокет?

Ответы [ 3 ]

0 голосов
/ 12 октября 2010

Вам необходимо инициировать упорядоченное отключение.После вызова flush для потоков и перед вызовом close для сокета добавьте:

pacConx.shutdownInput();
pacConx.shutdownOutput();

, который сообщает удаленному концу, что вы закончили, и позволяет демонтировать порт, не дожидаясь, чтобы убедиться, что нетданные еще в пути.

0 голосов
/ 12 октября 2010

Примерно через 2-4 минуты после закрытия сокета он будет зависать в состоянии "CLOSE_WAIT" на сервере. Это обычная часть протокола TCP / IP для обработки задержанных пакетов, все еще блуждающих в сети.

Это должно обрабатываться кодом вашего сервера. Разблокирует ли он свой сокет прослушивания при обработке запроса и попытке восстановить его после закрытия? Если это так, он должен либо оставить прослушивание во время обработки, либо заново установить его с параметром SO_REUSEADDR.

0 голосов
/ 12 октября 2010

Попробуйте

...
dataOut.flush();
dataOut.close();
...

Вставьте сообщение об ошибке или / и трассировку полного стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...