Правильная реализация клиента переподключения C# TCP

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

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

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

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


person jethro    schedule 10.08.2010    source источник


Ответы (2)


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

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

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

person Jess    schedule 10.08.2010

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

http://ts3querylib.codeplex.com/

Взгляните на класс AsyncTcpDispatcher.

person Scordo    schedule 20.08.2010