0

我正在尝试创建一个 MVC.Net 控制器,它将在一个操作中启动一个 TCPClient。在另一个动作中读取最新结果,并在最后一个动作中关闭 TCPClient。但我不知道从哪里开始。

TCPClient 应该是类的对象吗?

这是我认为我需要如何开始的一些伪代码,但我无法将我的头包裹在这个想法上,将不胜感激

public class Foo : Controller
{
    TCPClient myClient = new TCPClient();

    public bool StartClient(string ip, int port)
    {
    }

    public string readMostRecentPacket()
    {
    }

    public bool StopClient()
    {
    }

}

我试图避免潜在的 DOSing TCP 连接,因为在单个操作中创建和关闭客户端开始拒绝连接,这是一个 AJAX 轮询隐喻

4

1 回答 1

0

在尝试此操作之前,您需要考虑一些事项:

  1. ASP.NET MVC 控制器是无状态的。这意味着每个请求都会创建一个新的控制器实例,您将无法跟踪任何状态。每个控制器动作都不知道任何先前的控制器动作,即使在同一个函数中也是如此。这是因为 HTTP 是无状态的。您可以使用 SessionState 或 Singleton 或应用程序缓存或数据库或其他东西来跟踪状态,但 ASP.NET MVC 不会为您跟踪事物。
  2. 多个用户最终将调用相同的控制器代码(相同的网页),并且您最终将运行代码的多个实例。这可能会在您的代码中引入难以跟踪的错误。另一种说法是多个线程调用相同的代码可能会导致严重的问题。
  3. 如果你最终成功地实现了你的方法,你可能会想要做某种连接或客户端池,因为创建网络连接的成本很高。

这是一种可能的方法(请谨慎使用,因为我尚未测试或实施此方法):

  1. 创建具有静态 TCPCient 对象列表或数组的静态类
  2. 对此类的所有访问都是同步或锁定的(请阅读 - 信号量、监视器或互斥锁)

这个静态类将是您应用程序中的单个实例,您需要防止多个线程/用户相互踩踏。您将需要请求 TCPClient 并在用户会话中跟踪它。这样,每个后续请求都可以查找 TCPClient 对象并采取任何必要的操作。

陷阱:

  1. 多线程
  2. 阻塞 - 当太多用户加载您的网页时,TCPClient 数组/列表可能不够大。
  3. 死锁
  4. 内存不足错误
  5. 等等。

希望这可以帮助。祝你好运。

于 2013-04-14T05:48:12.683 回答