Сброс соединения SocketException - PullRequest
0 голосов
/ 05 июля 2011

Я создал сервер, который принимает TCP-соединение. После подключения к сокету он зацикливается на чтение данных из входного потока.

Шаги:

  1. Я запустил свой сервер.
  2. Запустите клиент.

Теперь я закрываю клиента.

Тогда сервер выдает мне SocketException Reset Connection

Как проверить, жив ли мой клиент или нет, перед чтением из потока ввода.

Ответы [ 2 ]

2 голосов
/ 05 июля 2011

Если ваш сервер получает «сброс соединения», он, вероятно, выполняет запись в соединение, которое уже было закрыто другим концом. Хороший пример - браузер, пользователь которого нажимает кнопку «назад». Если это ожидаемое условие, игнорируйте исключение. Если это ошибка протокола приложения, отладьте приложение.

0 голосов
/ 05 июля 2011

Есть 2 способа проверить, подключен ли сокет, вы можете либо прочитать, либо записать в него, если он подключен, вы не получите ошибку, если он не подключен, вы получите ошибку. Вот как я проверяю, подключен ли сокет:

BufferedReader reader;

public void run()
{
    try
    {
        String message;
        while((message = reader.readLine())!=null) //The thread stops here untill the reader has somthing to read
        {
            System.out.println(message);
        }
     }catch(Exception e)
     {
         System.out.println("Client disconnected!");
         // an error is thrown when reader cannot read the stream because it is closed, you will get a connection reset error.
     }
}

Когда сокет подключен, читатель ждет, пока что-то будет прочитано (message = reader.readLine ()). Когда клиент отключается и Socket закрывается, считыватель выдает исключение, потому что нет ничего, что можно прочитать, потому что поток закрыт. Надеюсь, это поможет!

...