Каков предпочтительный способ обработки этого TCP-соединения в C #? - PullRequest
0 голосов
/ 27 февраля 2009

У меня есть серверное приложение (одноэлементное, простое консольное приложение .NET), которое взаимодействует с GlobalCache GC-100-12 для маршрутизации ИК-команд. Различные клиенты .NET WinForm в локальной сети подключаются к моему серверному приложению и отправляют ему команды ASCII. Серверное приложение ставит эти команды ASCII в очередь и затем отправляет их в GC-100-12 через TCP-соединение.

Мой вопрос: как лучше всего справиться с этим соединением с точки зрения сервера? Я могу придумать два пути:

  1. Создайте и откройте новый TcpClient для каждого отдельного запроса. Закройте TcpClient, когда запрос будет выполнен.

  2. Создайте и откройте один TcpClient при запуске сервера и используйте keep-alive (если необходимо), чтобы соединение оставалось открытым в течение всего срока службы объекта сервера.

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

В настоящее время я делаю # 1 и печатаю результаты каждой передачи на консоль. Иногда время ожидания некоторых соединений и команда не маршрутизируются, и мне было интересно, было ли это из-за накладных расходов на создание нового TcpConnection каждый раз, или это происходит из-за чего-то еще.

Я могу видеть # 2 более сложным, потому что, если соединение теряет связь, оно должно быть воссоздано, и для этого потребуется немного больше кода.

Я ищу общий совет по этому вопросу. У меня нет большого опыта работы с классом TcpClient.

1 Ответ

3 голосов
/ 27 февраля 2009

У нас был аналогичный случай открытия сеанса telnet для старой системы на основе PICK. Мы обнаружили, что стоимость открытия TCP-соединения каждый раз, когда поступал запрос, была довольно дорогой, и мы решили внедрить процедуру no-op, чтобы сохранить соединение открытым. Это сложнее, но если ваша конечная точка не пытается обслуживать множество клиентов, закрепление соединения звучит как жизнеспособное решение.

Вы также можете настроить его на тайм-аут, если вы хотите запретить держать соединение открытым, когда нет трафика. Пять минут бездействия, затем отключите соединение.

...