Правильная реализация C # TCP переподключения клиента - PullRequest
3 голосов
/ 10 августа 2010

Я должен написать TCP Client, который будет иметь возможность переподключиться к серверу. Сервер может быть недоступен из-за низкого качества сетевого подключения или из-за проблем с обслуживанием. Я ищу качественные решения в этой области.

Мои текущие решения следующие:

  • сохранить состояние соединения в ConnectionState enum {Offline, Online, Connecting}
  • создать клиента с TcpClient классом.
  • создайте два таймера с именами ConnectionCheckTimer и ReconnectTimer
  • подключиться к серверу
  • запуск чтения ридера и таймера проверки соединения
  • чтение выполняется с помощью tcpClient.GetStream (), а затем чтение из этого потока
  • когда исключение перехватывается в состоянии клиента readerLoop, изменяется на автономный и запускается ReconnectTimer
  • ConnectionCheckTimer периодически проверяет lastMessageTimestamp и сравнивает его с текущим временем, если интервал больше, чем maxValue, который он запускает ReconnectTimer

В настоящее время я не удовлетворен этим решением, потому что оно все еще генерирует исключения для экземпляра ObjectDisposedException в TcpClient.NetworkStream. Я ищу чистый и многократно используемый клиент Tcp для повторного подключения реализации, способный справиться со всеми проблемами сокетов, которые могут возникнуть при подключении, отключении, чтении данных.

Ответы [ 2 ]

1 голос
/ 11 августа 2010

Если у вас есть проблемы с подключением, у вас всегда будут исключения. Я думаю, что у вас есть четкий план, вам просто нужно обработать исключения. Вы можете начать с собственной реализации класса Socket и написать сервер TCPIP. Стартовый код на MS:

http://msdn.microsoft.com/en-us/library/fx6588te(VS.71).aspx

Код C # находится на полпути вниз по странице VB.

0 голосов
/ 20 августа 2010

Класс, который вы должны использовать, это "SocketAsyncEventArgs".Я использовал его в этом проекте:

http://ts3querylib.codeplex.com/

Посмотрите на класс AsyncTcpDispatcher.

...