【问题标题】:What is the preferred way to handle this TCP connection in C#?在 C# 中处理这个 TCP 连接的首选方法是什么?
【发布时间】:2010-10-10 08:53:30
【问题描述】:

我有一个服务器应用程序(单例、简单的 .NET 控制台应用程序),它与 GlobalCache GC-100-12 通信以路由 IR 命令。本地网络上的各种 .NET WinForm 客户端连接到我的服务器应用程序并向其发送 ASCII 命令。服务器应用程序将这些 ASCII 命令排队,然后通过 TCP 连接将它们发送到 GC-100-12。

我的问题是,从服务器的角度来看,处理此连接的最佳方式是什么?我可以想到两种方法:

  1. 为每个单独的请求创建并打开一个新的 TcpClient。请求完成后关闭 TcpClient。

  2. 在服务器启动时创建并打开一个 TcpClient,并使用 keep-alive(如有必要)在服务器对象的生命周期内保持连接打开。

我问这个问题是因为我想知道为每个请求创建一个新的 TcpClient 的开销。这是一项昂贵的手术吗?这是一种不好的做法吗?

目前我正在做#1,并将每次传输的结果打印到控制台。有时一些连接超时并且命令没有被路由,我想知道这是因为每次创建新的 TcpConnection 的开销,还是因为其他原因。

我可以看到 #2 更复杂,因为如果连接确实断开,则必须重新创建它,这将需要更多代码来处理这种情况。

我正在寻找任何关于此的一般性建议。我没有很多使用 TcpClient 类的经验。

【问题讨论】:

    标签: c# .net tcp tcpclient lifetime


    【解决方案1】:

    我们有一个类似的案例,即打开一个远程登录会话到一个旧的基于 PICK 的系统。我们发现每次请求进入时打开 TCP 连接的成本相当昂贵,因此我们决定实现一个无操作例程来保持连接打开。它更复杂,但只要您的端点不尝试为许多客户提供服务,那么固定连接听起来是一个可行的解决方案。

    如果您想防止在没有流量时保持连接打开,您也可以将其设置为超时。五分钟无活动然后关闭连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2011-10-18
      • 1970-01-01
      • 2012-03-25
      相关资源
      最近更新 更多