如何:TcpClient NetworkStream 的生命周期

3
我有一个ASP.NET CORE MVC Web应用程序,需要与TcpServer进行通信以完成特定任务。我在Web应用程序中编写了一个类来管理对该TcpServer的请求。
我的Tcp客户端类包含一个名为Request(string message)的方法,旨在由ASP.Net Web应用程序调用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文档和栈溢出。我看到的所有示例都只发送单个请求。这对我没有真正帮助,因为在Web应用程序的生命周期中,我将多次发送请求。它将是非常频繁的请求。我想了解如何管理这个问题。
我是TCP服务器和客户端的新手。什么是正确的生命周期?使用TcpClient和NetworkStream的正确方式是什么?
更具体地说,我应该在每个请求上创建并关闭TcpClient吗?还是TcpClient应该是一个在我的Web应用程序的整个生命周期内保持打开状态的单例......在这种情况下,我假设流应该是我应该在每个请求上打开和关闭的对象。

1
你不需要频繁地打开和关闭套接字,只需在开始与TCP服务器通信时打开它,并在想要停止通信时关闭它。但是你需要通过定义一个指示响应结束的模式来修改你的TCP服务器,这样当你读取到该模式时,就知道响应已经完成了。 - muaz
如果连接无限期开放(这是一个Web服务器,理论上会一直持续下去),那么保持连接始终打开是否会有任何性能问题?此外,我假设服务器也必须一直保持连接打开状态(我也正在开发Tcp服务器)。 - Ian Kirkpatrick
@muaz,把这个作为答案,并回复我刚才评论中的性能问题,我会将其标记为已接受的答案。 - Ian Kirkpatrick
1个回答

1
您无需频繁打开和关闭套接字,只需在与TCP服务器停止通信时打开它一次并关闭它,但您需要通过定义指示响应结束的模式来修改TCP服务器,因此当您读取该模式时,您就知道响应已完成。
关于性能问题,这取决于您使用该连接的方式,如果您确定您的通道是安全的,并且您拥有足够的资源,则保持其打开肯定更好。然而,如果您不经常使用它,则每次打开和关闭都可以。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接