Как: жизненный цикл TcpClient NetworkStream - PullRequest
1 голос
/ 13 июня 2019

У меня есть веб-приложение ASP.NET CORE MVC, которое для определенных задач должно взаимодействовать с TcpServer. У меня есть класс в веб-приложении, который управляет запросами к этому TcpServer.

Мой клиентский класс Tcp содержит метод с именем Request (строковое сообщение), который должен использоваться моим веб-приложением ASP.Net для вызова TcpServer и возврата ответа TcpServer. Метод идет так:

public string Request(string message)
{
    // Open stream and client.
    TcpClient client = new TcpClient(this._ipAddr, this._port);
    NetworkStream stream = client.GetStream();

    // Write to stream
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
    stream.Write(data, 0, data.Length);

    // Read from stream to get response. Read 256 bytes at a time so
    // as not to overload the system in case requests are ginormous.
    Byte[p] data = new Byte[256];
    string responseData = "";
    int bytesRead;
    while ( (bytesRead = stream.Read(data, 0, 256)) > 0)
    {
        responseData += System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
    }

    // Close stream and client
    stream.Close();
    client.Close();

    return responseData;
}

Обратите внимание, что я вызываю этот метод много раз в приложении. Поэтому я постоянно обновляюсь (и для этого подключаюсь) и закрываю как TcpClient, так и NetworkStream.

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

Я плохо знаком с TCP-серверами и клиентами. Каков правильный жизненный цикл? Как правильно использовать TcpClient и NetworkStream?

Если быть более точным, должен ли я обновлять и закрывать TcpClient при каждом запросе? Или же TcpClient должен быть одноэлементным, который открыт на протяжении всего жизненного цикла моего веб-приложения ... В этом случае я предполагаю, что поток - это то, что я должен открывать и закрывать для каждого запроса.

1 Ответ

0 голосов
/ 13 июня 2019

Вам не нужно часто открывать и закрывать сокет, просто откройте его и закройте, когда вы хотите прекратить общение с этим TCP-сервером, но вам нужно изменить свой TCP-сервер, определив шаблон, который указывает конец конца ответ, поэтому, когда вы читаете этот шаблон, вы знаете, что ответ сделан.

Что касается проблем с производительностью, это возвращает вас к тому, что вы используете это соединение, если вы уверены, что ваш канал защищен и у вас достаточно ресурсов, тогда определенно лучше оставить его открытым. Тем не мение; если вы не используете его часто, то можно открывать и закрывать его каждый раз.

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