GrassRoot备份项目

Windows服务项目

Grass.cs

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http.Headers;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Xml.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;



namespace Grass
{
    public class GrassRoot
    {
        private HttpListener listener;
        private string url = "http://+:8422/"; //"http://localhost:8422/" 监听的URL//listener.Prefixes.Add("http://+:8422/"); // 监听所有IP地址上的8422端口")
        private string proxy_url = string.Empty;
        volatile bool runing = false;
        private Thread listenThread;
        private List<Thread> ListThread = new List<Thread>();
        private readonly SynchronizationContext _synchronizationContext = SynchronizationContext.Current;//跨线程需要同步上下文

        public GrassRoot()
        {
            listener = new HttpListener();
            listener.Prefixes.Add(url);
            listener.Start();
        }

        public void Start()
        {
            if (listener == null)
            {
                listener = new HttpListener();
            }

            if (listener.IsListening == false)
            {
                listener.Start();
            }
            if (this.listenThread == null || this.listenThread.IsAlive == false)
            {
                this.listenThread = new Thread(new ThreadStart(ListenForRequests));
                this.listenThread.IsBackground = false;//前台线程不会自动退出,thread类默认前台线程,前台线程会阻塞主线程
            }
            switch (listenThread.ThreadState)
            {
                case System.Threading.ThreadState.Unstarted:
                    this.listenThread.Start();
                    runing = true;
                    break;
                case System.Threading.ThreadState.StopRequested:
                case System.Threading.ThreadState.AbortRequested:
                case System.Threading.ThreadState.Aborted:
                case System.Threading.ThreadState.Stopped:
                case System.Threading.ThreadState.Suspended:
                case System.Threading.ThreadState.SuspendRequested:
                    this.listenThread.Abort();
                    this.listenThread = new Thread(new ThreadStart(ListenForRequests));
                    this.listenThread.IsBackground = false;//前台线程不会自动退出,thread类默认前台线程,前台线程会阻塞主线程
                    this.listenThread.Start();
                    runing = true;
                    break;
                case System.Threading.ThreadState.Running:
                    runing = true;
                    break;
            }
        }
        public void Stop()
        {
            if (listener != null && listener.IsListening == true)
            {
                listener.Stop();
                listener.Close();
            }
            ListThread.Clear();
            GC.Collect();
        }
        private void ListenForRequests()
        {
            Task.Run(() =>
            {
                // 创建一个新的线程来处理客户端通信  
                Thread clientThread = new Thread(HandleRequests);
                clientThread.IsBackground = true;   //后台线程不阻塞主线程,后台线程用完后自动退出
                clientThread.Start();
                ListThread.Add(clientThread);
                //剔除睡眠线程
                for (int i = 0; i < ListThread.Count; i++)
                {
                    if (ListThread.ElementAt<Thread>(i).ThreadState == System.Threading.ThreadState.Stopped)
                        ListThread.RemoveAt(i);
                }
                GC.Collect();
            });
        }
        // 处理请求
        private async void HandleRequests()
        {
            while (listener.IsListening)
            {
                // 等待传入的请求
                HttpListenerContext context = await listener.GetContextAsync();

                // 处理请求
                HttpListenerRequest request = context.Request;
                HttpListenerResponse response = context.Response;

                Console.WriteLine($"Received request for {request.Url}");

                // 构造响应内容
                string responseString = "<html><body><h1>Hello, World!</h1></body></html>";
                byte[] buffer = Encoding.UTF8.GetBytes(responseString);

                // 设置响应头
                response.ContentType = "text/html";
                response.ContentLength64 = buffer.Length;
                response.ContentEncoding = Encoding.UTF8;

                // 获取当前UTC时间并转换为本地时间
                DateTime utcNow = DateTime.UtcNow;
                TimeZoneInfo localZone = TimeZoneInfo.Local;
                DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, localZone);

                // 设置响应头中的Date和Last-Modified为本地时间
                //response.Headers["Date"] = localTime.ToString("R"); // RFC1123格式
                response.Headers["Last-Modified"] = localTime.ToString("R"); // RFC1123格式
                //response.Headers["Date"] = DateTime.UtcNow.ToString("R"); // RFC1123格式
                //response.Headers["Last-Modified"] = DateTime.UtcNow.ToString("R"); // RFC1123格式
                                                                          // 发送响应
                await response.OutputStream.WriteAsync(buffer, 0, buffer.Length);
                response.Close();
            }
        }
    }
}

Program.cs

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace GrassRoot
{
    internal static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new Service1()
            };
            ServiceBase.Run(ServicesToRun);
        }
    }
}

Service1.cs

cs 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using Grass;

namespace GrassRoot
{
    public partial class Service1 : ServiceBase
    {
        Grass.GrassRoot grassRoot =new Grass.GrassRoot();
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            grassRoot.Start();
            EventLog.WriteEntry("GrassRoot started");
        }

        protected override void OnStop()
        {
            grassRoot.Stop();
            EventLog.WriteEntry("GrassRoot stopped");
        }
    }
}
相关推荐
samble6 小时前
从零搭建灌装监控系统(十二):配置系统,原子写入与容错
c#·wpf·mvvm·modbus·工业控制
流形填表9 小时前
题库去重实战:基于题干指纹的重复题清理
开发语言·c#
开开心心就好15 小时前
以图搜图找重复图片,本地工具离线就能用
javascript·智能手机·ffmpeg·c#·ocr·word·音视频
QQ_216962909615 小时前
基于C#(Asp.net)电竞陪玩信息管理系统的设计与实现
java·大数据·spring boot·微信小程序·c#·云计算·asp.net
未来之窗软件服务1 天前
C# 截图源码支持自动保存-东方仙盟
c#·仙盟创梦ide·东方仙盟·电脑工具
UIU1142 天前
-7 / 2 在 C 里是 -3,在 Python 里是 -4,谁算错了?
c++·学习·c#
wflynn2 天前
GitHub 今日推荐|REDox:64 位 token 表示结构化数据,内存占用降 70% 支持多格式互转
开源·c#·github
驰骋工作流2 天前
C#/.NET 开源BPM工作流引擎6大常用对比选型分析驰骋BPM驰骋低代码低代码工作流引擎
开源·c#·.net
en.en..2 天前
C语言 fp与fd 区别详解
c#
淡海水2 天前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc