Гнездо открывать и закрывать на 1 сек или держать открытым - PullRequest
4 голосов
/ 02 февраля 2011

Мне нужно периодически общаться с plc (каждые 1 сек), я отправляю сообщение и получаю сообщение.Я использую Socket класс для этого общения.Нужно ли каждые 1 секунду открывать соединение (socket=new Socket(ipaddress, port)), отправлять сообщение затем socket.close() и т. Д. Или постоянно удерживать сокет?

Ответы [ 3 ]

8 голосов
/ 02 февраля 2011

Полагаю, вы говорите о TCP-сокетах здесь ...

Помимо очевидной неэффективности, связанной с настройкой TCP-соединения каждую секунду, вы также, вероятно, в конечном итоге накапливаете сокеты в TIME_WAIT (надеюсь на вашем клиенте).

Я написал о TIME_WAIT и проблемах, связанных с масштабируемостью и стабильностью сервера, здесь, в моем блоге: http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html

Учитываяскорость, с которой вы открываете и закрываете сокеты (раз в секунду это приведет к тому, что 240 (60 * 4) сокетов будут сидеть в TIME_WAIT в нормальном (4 минуты) периоде 2MSL TIME_WAIT), это не должно быть слишком большойпроблема в том, что сокеты TIME_WAIT находятся на клиенте, а не на сервере, и если вы не подключаетесь к большому количеству серверов каждую секунду, но ... Если у вас много клиентов, подключающихся к вашему серверу каждую секунду, и выесли вы не уверены, что ваш сервер не накапливает сокеты в состоянии TIME_WAIT, вы можете ограничить масштабируемость вашего сервера.

Альтернативой являетсяd Разъем соединения разомкнут и открывать его можно только в том случае, если и когда он прерван.Это может оказаться немного сложнее для первоначального программирования, но пул соединения таким способом, вероятно, будет значительно более эффективным (когда вам действительно нужно отправлять данные, вы просто отправляете данные, и вам не нужно проходить через TCP рукопожатие дляустановить соединение) и намного более эффективный ресурс на клиенте;ты не вечно держишь 240 розеток в TIME_WAIT ...

4 голосов
/ 02 февраля 2011

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

3 голосов
/ 02 февраля 2011

У вас могут быть постоянно подключенные клиенты, в которых клиент всегда подключен к серверу.Но производительность этого подхода зависит от того, как реализован сервер.Если он использует многопоточную модель (один поток на клиентское соединение), вы можете столкнуться с нехваткой ресурсов при обработке большого количества клиентских соединений.Вы должны хорошо придерживаться подхода бессрочного клиента, если ваш сервер использует подход, основанный на событиях, для обработки запросов, пока «вычисления» недолговечны.

Как всегда, бенчмарк основан на ваших случаях использованияи тебе надо идти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...