Создание TcpClient кажется очень медленным.Могу ли я их кешировать? - PullRequest
2 голосов
/ 19 июня 2011

У меня есть программа, в которой клиентские одноранговые узлы общаются друг с другом через TCP-IP. Когда один клиент делает что-то, он будет сигнализировать другим клиентам один за другим, что это произошло. Вот код, который я использую для отправки данных:

public static string SendDirect(string data, string hostName, int portNumber)
        {
            string responseData;

            try
            {
                var client = new TcpClient(hostName, portNumber);

                Stream s = client.GetStream();
                var sw = new StreamWriter(s) { AutoFlush = true };

                sw.WriteLine(data);

                s.Close();
                client.Close();

                s.Dispose();
                sw.Dispose();

                responseData = "OK";
            }
            catch (SocketException ex)
            {
                responseData = ex.Message;
            }

            return responseData;
        }

Line

var client = new TcpClient (hostName, номер_порт);

может быть очень медленным для некоторых машин. Например, в моей домашней сети это занимает 2-3 секунды. Можете ли вы увидеть, как это плохо с 15 клиентами.

Мне было интересно, насколько дорого или, если вообще возможно, не закрывать клиента каждый раз и постоянно держать 30-40 из них открытыми? Я предполагаю некоторый механизм, чтобы проверить, чтобы они были живы и чтобы все они были закрыты должным образом, должны быть закодированы, но мне интересно, верна ли сама идея ..

Спасибо!

1 Ответ

1 голос
/ 19 июня 2011

Ничто не должно удерживать или ограничивать вас от создания более одного клиента / соединения одновременно. На самом деле, инициирование и закрытие тонн соединений может вызвать различные проблемы безопасности (пытаясь отразить возможную атаку DDOS или что-то еще). Вы также можете ускорить процесс разрешения имен хостов и их кэширования. Это не обязательно должно быть создание объекта, которое на самом деле замедляет вас.

Операционная система может ограничивать число ожидающих подключений в секунду (например, 10 в секунду в Windows), но в остальном проблем быть не должно. На мой взгляд, вы не должны открывать / закрывать соединения для отдельных команд. Вам следует подумать о том, чтобы держать оба открытых, TcpClient и StreamWriter. Просто убедитесь, что вы сбросили, когда закончите писать свой пакет. Чтобы повысить производительность, вам следует подумать о ручной очистке, особенно если каждому клиенту нужно отправить более одной команды / пакета, поскольку каждый пакет будет иметь минимальный размер окна TCP (обычно около 1492-1500 байт).

...