注册.net VS开发的windows服务程序有两种方式:
1) 利用windows自带的服务管理程序(sc.exe)
创建:sc create eOperationService binpath= "C:/eOperationServer/eOperationServer.exe --service" displayname= "eOperationService" start= auto
配置: sc config eOperationService binpath= "C:/eOperationServer/eOperationWindowsService.exe"
2) 利用安装程序工具(Installutil.exe)
cd 到C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727
注册服务: InstallUtil C:/eOperationServer/eOperationServer.exe
删除服务: installutil /u C:/eOperationServer/eOperationWindowsService.exe
eOperationWindowsService是vs开发的windows 服务程序,是在服务控制管理器(SCM) 中注册多项服务的可执行文件。
喜欢第一种方式,因为Installutil.exe需要安装.net Framework
eOperationServer作为其中的service1,接收客户端消息并为客户提供非实时服务,消息是以socket方式传递。
/********socket传送信息的解析步骤***************/
1)客户端向service1传递指定长度的报文,内容为后续数据报文的长度,通常为5位字节长。
2)服务端接收到表示长度的报文后,会给客户端一个应答报文(OK/ERROR)
3)如应答报文为OK,客户端给服务端传送数据(报文长度为上面约定的大小)
4)客户端数据报文传送完后可立即关闭连接,异步处理其它的任务,服务端接收完数据会check数据大小
5)如应答报文为ERROR,客户端同步给用户显示错误信息,不再传送数据报文
定义这种传送数据的方式,可以防止socket报文丢失,从而保证请求数据的完整。客户端的数据IO是这样的:
1, 发送70000的二进制数据到server,等待server返回消息
2, 接收到消息OK,发送数据;消息不是OK,报错
客户端可以重复上面的两个步骤发送消息到service1,但可能出现第一个消息的2与第二个消息的1被封装在同一个二进制数据流中发送过去;为防止这种情况,可以在发送完2后,进程等待一段时间:Thread.Sleep(1000);
service1的定时器需要添加如下设置,表明它是一次性而非重复执行:
this.timer1.AutoReset = false;
service1的ElapsedEventHandler 委托中包含socket的创建,侦听,响应。这部分代码如封闭成dll,通过函数调用,服务端的socket会创建不成功,后来尝试向dll传入ServerSocket,侦听阻塞。
个人认为是windows服务中,进程的资源分配不能在dll中进行,dll中的socket也不能接收外部进程的socket数据(但连接可以建立)。后台将socket的创建,侦听,响应部分直接写在eOperationServer中就OK了
如果service1中有访问数据库,可以将服务的登陆改为本地系统账户.