如何在Windows中开发服务器

How to develop a server in Windows

本文关键字:开发 服务器 Windows      更新时间:2023-10-16

我是作为一个有着丰富Linux系统编程背景的人来问这个问题的。我在Windows开发方面几乎没有经验,到目前为止,这仅限于"控制台应用程序"类型的程序。

在知道服务器必须在Windows上运行的情况下,开发服务器的规范过程是什么

是否立即构建Windows服务应用程序?调试过程真的像看上去那么令人讨厌吗?Windows开发人员是否为了调试而从命令行应用程序开始,只将其转换为服务进行部署?

作为比较,我将提供Linux"服务器"是所选语言的常规命令行程序。我将服务器定义为一个程序

  1. 以日志的形式产生其大部分人类可读输出
  2. 接受来自操作系统的输入(例如网络或文件系统事件),而不是"用户点击了按钮"或"用户键入了命令",以及
  3. 作为守护进程部署

Windows系统管理员可能期望使用完全不同的接口来启动、停止和管理服务器。我对此完全持开放态度;我只是还没有看到事情的全貌。

$ ./my-server &
Starting...
$ head /var/my-server.log
2012-3-10 14:34:43.934 [info] Server started! Waiting for connection from client
$ 

首先:是的,Windows上的服务器几乎总是最好作为系统服务来实现。但是,如果服务器也可以从命令行运行以进行故障排除,则会带来额外的好处。

通常情况下,构建代码的结构并不太困难,以便将特定于服务的逻辑抽象为函数,这些函数可以检查您是作为服务运行还是在命令行上运行,并相应地进行操作。我更喜欢有一个单一的源模块,只包含main()函数和特定于服务的东西。为了获得最佳效果,请确保只有此模块知道您在哪种模式下运行。(还请注意,此模块通常可以从一个项目继承到下一个项目,只需进行适度的更改。)

这样做的另一个优点是,这意味着您可以在命令行模式下进行大部分调试,而不需要多个构建选项。您仍然需要测试(可能还需要调试)服务逻辑本身,但这是一项小得多的工作。

这里有一些额外的信息,你可能已经看到了。

在Windows上,服务是

  1. 以发送到事件日志的事件的形式产生其大部分人类可读的输出;

  2. 通过操作系统喜欢响应的任何事件接受来自操作系统的输入,但必须始终响应来自服务控制管理器(SCM)的请求(如"启动服务"、"停止服务","暂停服务"…)

    具体如何传递这些事件取决于您使用的所选编程语言的功能;在C(即操作系统级别)中,您必须设置一个事件循环并检查接收到的事件。通常,您将在分离的线程中执行实际工作,主线程位于事件循环中。

  3. 作为一个服务部署,该服务通常是一个控制台可执行文件,它将自己注册到SCM。

有关.NET中服务的更多信息,请参阅此处;关于这一切如何在C级(即没有任何花哨的语言设施)工作的细节,请参阅此处。