Wahaj Khan Ответов: 3

Как обнаружить отключение клиента от сервера с помощью tcpclient


I have two separate applications Client and Server used to send and receive data from Ethernet Cable. The Client application sends the data to server. First when the server application is started, it starts accepting client request to accept data. As soon as client is connected , Server thread is started to receive data from Client. Whenever Client application is stopped, there must be either some command send to the server to notify that it has disconnected or there must be some way to detect client disconnection at server end so that thread can be closed for receiving data from Client. I am using TCPClient for this purpose. Kindly suggest some way to do this.
Спасибо

Что я уже пробовал:

я пытаюсь отключить клиента от сервера, но сервер все равно видит, что он подключен.

Rob Philpott

Хорошо, это не авторский ответ, так как я не совсем уверен, но я думаю, что если у вас есть TcpClient на стороне сервера, и предположительно у вас есть поток от него, из которого Вы читаете то, что клиент посылает вам.

Чтение из потока синхронно блокируется, пока не будут получены байты. В случае отключения вызов разблокируется, но вы не прочитаете ни одного байта.

Я *думаю*, что вы можете использовать это, после чего вы должны сделать цикл закрытия/выключения.

3 Ответов

Рейтинг:
2

Gerry Schmitz

"Сервер" "сбрасывает" соединение через определенный промежуток времени, если никакой активности нет ("тайм-аут").

"Сервер" не может зависеть от клиента, чтобы закрыть "свое" соединение, потому что клиент(ы) может "умереть" в любой момент времени, прежде чем отправить какие-либо "последние запросы".


Рейтинг:
1

Jochen Arndt

Каждая сторона соединения должна информировать другую сторону, когда она закрывает соединение.

Это должно быть сделано на уровне протокола передачи данных. Например, одна сторона посылает запрос на прекращение связи, а другая отвечает ответом подтверждения. Сторона, отправляющая запрос, закрывает соединение, когда ответ получен, а другая сторона-после отправки ответа.

Для обработки неожиданных отключений используйте функцию, предоставленную Ричардом в решении 1. Но обратите внимание, что это возвращает состояние самой последней операции, которое обычно не является фактическим состоянием. Чтобы вызвать получение фактического состояния, просто отправьте запрос на другую сторону. Это может быть специальный запрос, на который не следует отвечать (kinf of NOOP / No Operation или keep alive). Если другой стороны больше нет, отправка запроса завершится неудачей, и соединение (и поток) может быть закрыто.