c# - 如何: TcpClient NetworkStream Lifecycle

标签 c# network-programming asp.net-core-mvc tcpclient networkstream

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

我的 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 应该是一个在我的网络应用程序的整个生命周期中都打开的单例...在这种情况下,我假设流是我应该为每个请求打开和关闭的。

最佳答案

你不需要经常打开和关闭你的套接字,只需要打开它一次,当你想停止与那个 TCP 服务器对话时关闭它,但是你需要通过定义一个模式来修改你的 TCP 服务器响应,因此当您阅读该模式时,您就知道响应已完成。

关于性能问题,这又回到了你对那个连接的使用,如果你确定你的 channel 是安全的并且你有足够的资源那么肯定是保持它打开更好。然而;如果您不经常使用它,则可以每次打开和关闭它。

关于c# - 如何: TcpClient NetworkStream Lifecycle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56581912/

相关文章:

networking - 很多端口数据很少,还是一个端口数据很多?

c# - 尝试同时监听多个端口时出现 SocketException C#

c# - 引用项目并调用其类时出错

C# 使用 HTML Agility Pack 解析隐藏字段

rss - 在 ASP.NET Core 1.0 RC2 中使用 RSS 的正确方法

javascript - 突然丢失 Visual Studio Typescript Intellisense

c# - 无法从 .NET 4.6 中的 C# Web 项目引用 F# 库?

c# - 将组合框绑定(bind)到 2 个数据源 : Table & Enum

network-programming - Wifi-Direct 和 Miracast 之间的真正区别

network-programming - 在子网外发送 udp 消息