我应该为我的 Windows 服务使用啥网络编程类?

Posted

技术标签:

【中文标题】我应该为我的 Windows 服务使用啥网络编程类?【英文标题】:What network programming class should I use for my Windows service?我应该为我的 Windows 服务使用什么网络编程类? 【发布时间】:2020-06-23 19:42:47 【问题描述】:

我有一个运行某些任务的 Windows 服务。我需要在其任务列表中添加一些网络功能。

网络逻辑如下所示:

+-------------------+                                                  +---------------+
|                   |                                    send request  |               |
|                   |                                   for some data  |               |
|                   |  <---------------------------------------------  |               |
|                   |                                                  |               |
|                   |  process request                                 |    Client     |
|  Windows Service  |                                                  |  Application  |
|                   |  send response                                   |               |
|                   |  --------------------------------------------->  |               |
|                   |                                                  |               |
|                   |                                process response  |               |
+-------------------+                                                  +---------------+

注意:可以有多个客户端应用程序同时请求数据。

注意:每个客户端应用程序可以同时发送多个数据请求。

注意:Windows 服务和客户端应用程序可以驻留在同一网络或不同的网络中。

这是 Windows 服务的基本布局:

class Processor : System.ServiceProcess.ServiceBase

    private System.Timers.Timer Timer1 = null;
    private System.Timers.Timer Timer2 = null;
    private System.Timers.Timer Timer3 = null;

    protected override void OnStart(string[] args)
    
        Timer1 = new System.Timers.Timer();
        Timer1.Interval = ...;
        Timer1.AutoReset = true;
        Timer1.Elapsed += new ElapsedEventHandler(...);
        Timer1.Start();

        Timer2 = new System.Timers.Timer();
        Timer2.Interval = ...;
        Timer2.AutoReset = true;
        Timer2.Elapsed += new ElapsedEventHandler(...);
        Timer2.Start();

        Timer3 = new System.Timers.Timer();
        Timer3.Interval = ...;
        Timer3.AutoReset = true;
        Timer3.Elapsed += new ElapsedEventHandler(...);
        Timer3.Start();

        // I was thinking of creating a new Task (System.Threading.Tasks.Task) or Timer (System.Timers.Timer) here to handle the networking-related logic.
    

    protected override void OnStop()
    
        Timer1.Stop();
        Timer1.Close();

        Timer2.Stop();
        Timer2.Close();

        Timer3.Stop();
        Timer3.Close();
    

我一直在阅读微软的网络编程documentation,但我仍然不知道哪个课程最适合我的情况。

我一直在考虑使用的类是:

Socket TcpListener(用于 Windows 服务)和TcpClient(用于客户端应用程序) HttpListener(用于 Windows 服务)和HttpClient(用于客户端应用程序)

TcpListener 和 TcpClient 类是 Socket 类的包装器。它们似乎隐藏了许多实现细节并使代码更易于理解。 Socket 类提供的功能数量似乎相当庞大,但它可以处理multiple client connections。 TcpListener 可以处理多个客户端还是一次只能监听一个?

哪种网络课程最适合我的情况?我如何保证请求将以响应的方式提供服务,同时又保证与网络无关的任务将继续执行而不会被阻塞?

【问题讨论】:

我喜欢你的问题..但它已经加载,所以我只是给你我的初步想法......我会考虑使用 Windows Communication Foundation,它可以让你做任何你想做的事,并且以强类型的方式。至于阻塞,请确保所有网络内容都是异步的。 当您说“确保所有网络内容都是异步的”时,在单独的线程/任务/计时器中生成“网络对象”(无论它可能是什么)就足够了吗? 可能相关:***.com/questions/48522849/… 我只是将异步作为一个一般概念(线程、回调,任何有意义的东西)。这很可能涉及 .NET 中的 async/awaitTasks。例如TcpClient,有一个Connect 方法和一个ConnectAsync 方法,如果这是你选择的方向,你可能会更喜欢后者。 @chadnt dotnetfoundation.org/blog/2019/06/07/… 【参考方案1】:

注意:Windows 服务和客户端应用程序可以驻留在同一网络或不同的网络中。

至少在这里我可以给你一个半好的答案。网络类不关心另一端是否在同一台计算机、同一交换机或 Voyager 2 探测器上。如果它适用于 localhost,则通常是网络管理员的工作来确保存在路径。

获得可跨网络访问的服务 - 特别是在互联网上,不幸的是进入服务器托管。 Wich 与编程是完全不同的话题。根据环境的实际情况,改变的范围可以从“没有”到“服务器设计的完全改变”。但它应该更多地放在“无”方面,因为确保服务器可访问是服务器管理员的工作。

【讨论】:

大声笑,我喜欢,航海者 2 探测通信肯定需要异步! @rfmodulator 那和一个真的寿命。老实说,最好改变设计。在正确的天线上的时间很难安排。【参考方案2】:

我做了一些研究,但我错了。 TcpListener 类可以一次处理more than one pending client connection。

由于消息应该保持很小,与 HTTP 相关的类似乎有点过头了。

由于我的要求相对简单,我宁愿坚持更简单的设计,我将使用 TcpListener 和 TcpClient 类。

【讨论】:

以上是关于我应该为我的 Windows 服务使用啥网络编程类?的主要内容,如果未能解决你的问题,请参考以下文章

我应该为我的自动增量 ID MySQL 使用啥大小的 INT

我应该为我的高性能 Web 服务选择哪种编程语言? [关闭]

我们啥时候应该在 IIS 中托管 WCF 服务,啥时候应该在 Windows 服务中托管?

我可以使用啥技术为我的 C# 应用程序编写一个视图? [关闭]

对于一般网络问题,我可以使用啥例外?

UWP的类库和windows运行时组件有啥区别