如何:TcpClient NetworkStream 生命周期

How to: TcpClient NetworkStream Lifecycle

我有一个 ASP.NET CORE MVC Web 应用程序需要与 TcpServer 通信以完成某些任务。我在 Web 应用程序上有一个 class 来管理对此 TcpServer 的请求。

我的 Tcp 客户端 class 包含一个名为 Request(string message) 的方法,我的 ASP.Net Web 应用程序使用它来调用 TcpServer 和 returns 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 文档和堆栈溢出。我看到的所有示例只发送一个请求。这并没有真正帮助我,因为我将在 Web 应用程序的整个生命周期中多次发送请求。这将是一个非常频繁的请求。我想了解如何管理它。

我是 TCP 服务器和客户端的新手。什么是正确的生命周期?使用 TcpClient 和 NetworkStream 的正确方法是什么?

更具体地说,我应该在每次请求时更新并关闭 TcpClient 吗?或者 TcpClient 应该是一个在我的网络应用程序的整个生命周期中都打开的单例...在这种情况下,我假设流是我应该为每个请求打开和关闭的。

您不需要频繁打开和关闭套接字,只需打开一次并在您想停止与该 TCP 服务器通信时关闭它,但您需要通过定义一个指示结束的模式来修改您的 TCP 服务器的响应,因此当您阅读该模式时,您知道响应已完成。

关于性能问题,这 returns 您对该连接的使用情况,如果您确定您的频道是安全的并且您有足够的资源,那么最好保持它打开。然而;如果您不经常使用它,则可以每次打开和关闭它。