您当前的位置:首页 > 计算机 > 编程开发 > .net

C# windows服务启动与暂停

时间:11-09来源:作者:点击数:

启动对应的是OnStart

停止对应的是OnStop

下面是如何启动一个服务,本次例子服务是写一个服务端的socket通信

  protected override void OnStart(string[] args)
        {
           
            serverSocket = new Socket(SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Any;
            IPEndPoint point = new IPEndPoint(ip, 8978);
            //socket绑定监听地址
            serverSocket.Bind(point);

          
            
            //Console.WriteLine("Listen Success");
            //设置同时连接个数
            serverSocket.Listen(10);

            //利用线程后台执行监听,否则程序会假死
            Thread thread = new Thread(Listen);
            thread.IsBackground = true;
            thread.Start(serverSocket);
            Log.WriteLog(Log.LogLevel.INFO, "Listen:", "Start");
             

        }
        /// <summary>
        /// 监听连接
        /// </summary>
        /// <param name="o"></param>
        static void Listen(object o)
        {
            var serverSocket = o as Socket;
            while (true)
            {
                //等待连接并且创建一个负责通讯的socket
                var send = serverSocket.Accept();
                //获取链接的IP地址
                var sendIpoint = send.RemoteEndPoint.ToString();
                Log.WriteLog(Log.LogLevel.INFO, "Connected:", sendIpoint.ToString());

                //开启一个新线程不停接收消息
                Thread thread = new Thread(Recive);
                thread.IsBackground = true;
                thread.Start(send);
            }
        }

        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="o"></param>
        static void Recive(object o)
        {
            try
            {
                var send = o as Socket;
                while (true)
                {
                    //获取发送过来的消息容器
                    byte[] buffer = new byte[1024 * 1024 * 2];
                    var effective = send.Receive(buffer);
                    //Log.WriteLog(Log.LogLevel.INFO, "RemoteEndPoint:", send.RemoteEndPoint.ToString());
                    //有效字节为0则跳过
                    if (effective == 0)
                    {
                        Log.WriteLog(Log.LogLevel.INFO, "effective", effective.ToString());
                        break;
                    }
                    var str = Encoding.UTF8.GetString(buffer, 0, effective);
                    if (!str.Equals("[S]HeartBeat[E]"))
                        Log.WriteLog(Log.LogLevel.INFO, "received:", str + send.RemoteEndPoint.ToString());
                    //Console.WriteLine(str);
                    DevComm.sendSocket = send;
                    string strRet = devComm.CommandProc(str, send);
                    //if (!str.Equals("[S]HeartBeat[E]"))
                    //    Log.WriteLog(Log.LogLevel.INFO, "received:", str + send.RemoteEndPoint.ToString() + " return ");
                    //var buffers = Encoding.UTF8.GetBytes(strRet);
                    //Log.WriteLog(Log.LogLevel.INFO, "Send:", strRet);
                    //send.Send(buffers);

                }
            }
            catch (Exception e)
            {
                Log.WriteLog(Log.LogLevel.ERROR, "Connected:", "Disconnected" + e.Message.ToString());

                try
                {
                    if (IsExistsService(serviceName))
                    {
                        LaunchService(serviceName);
                    }
                    Log.WriteLog(Log.LogLevel.INFO, "服务遇到异常后重新启动成功:", e.Message.ToString());
                }
                catch (Exception ex)
                {
                    Log.WriteLog(Log.LogLevel.INFO, "服务遇到异常后重新启动失败:", ex.Message.ToString());

                }
            }
        }

下面是如何暂停方法,暂停和停止都要先判断该服务是否存在

 protected override void OnStop()
        {
            serverSocket.Close();

            Log.WriteLog(Log.LogLevel.INFO, "服务停止状态", "开始");

            try
            {
                if (IsExistsService(serviceName))
                {
                    StopService(serviceName);
                }
                Log.WriteLog(Log.LogLevel.INFO, "服务停止状态", "成功");
            }
            catch (Exception ex)
            {
                Log.WriteLog(Log.LogLevel.INFO, "服务停止状态", "失败" + ex.Message.ToString());
            }          

        }

        #region 判断服务是否存在
        private static bool IsExistsService(string serviceName)
        {
            /* 另一种方法
            得到当前计算机所有服务对象
            serviceController[] serviceControllers = ServiceController.GetServices();
            通过服务名【ServiceName】(非显示服务名DisplayServiceName) 得到服务对象①
            ServiceController serviceController = serviceControllers.SingleOrDefault(s => s.ServiceName == serviceName);
            */
            foreach (ServiceController sc in ServiceController.GetServices())
            {
                if (sc.ServiceName.ToUpper() == serviceName.ToUpper())
                {
                    return true;
                }
            }
            return false;
        }
        #endregion

        #region
        private static void InstallService(string serviceProgramPath)
        {
            using (AssemblyInstaller installer = new AssemblyInstaller())
            {
                installer.UseNewContext = true;
                installer.Path = serviceProgramPath;
                IDictionary saveState = new Hashtable();
                installer.Install(saveState);
                installer.Commit(saveState);
            }
        }
        #endregion
 
        #region 启动服务
        private static void LaunchService(string serviceName)
        {
            using (ServiceController currentService = new ServiceController(serviceName))
            {
                if (currentService.Status == ServiceControllerStatus.Stopped)
                {
                    currentService.Start();
                }
            }
        }
        #endregion

        #region 停止服务
        private void StopService(string serviceName)
        {
            using (ServiceController service = new ServiceController(serviceName))
            {
                if (service.Status == ServiceControllerStatus.Running)
                {
                    service.Stop();
                }
            }
        }
        #endregion

service对应的是服务名称,startType可以设置服务的启动类型

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门