我应该为我的 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
/await
和 Tasks
。例如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 服务中托管?