/// <summary> /// 启动本服务,调度初始化 /// </summary> /// <param name="args"></param> protected override void OnStart(string[] args) { AutoLog = true; try { LogInToEvent.WriteInfo("尝试启动"); InitAndStart(); } catch (Exception e) { LogInToEvent.WriteError(e.ToString()); System.Diagnostics.Process.GetCurrentProcess().Kill(); } }
/// <summary> /// 在web访问到来时取得访问报告,并返回给用户 /// </summary> /// <param name="a"></param> void Web_AfterConnectionGetReportAndSendToUser(object a) { System.Net.Sockets.TcpClient socketcomein = a as System.Net.Sockets.TcpClient; if (socketcomein == null) { LogInToEvent.WriteError("未知错误:socketcomein == null"); return; } try { var stream = socketcomein.GetStream(); System.IO.StreamReader rstream = new System.IO.StreamReader(stream); string i = rstream.ReadLine(); var where = i.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); if (! (where.Length == 3 && where[1].Trim().StartsWith("/")) ) { string errorMessage = "请求格式错误,请发送 GET / HTTP1.1 \n" + i; foreach (var p in where) { errorMessage += "\n" + p + "\n"; } var error_gs = System.Text.Encoding.UTF8.GetBytes(errorMessage); stream.Write(error_gs, 0, error_gs.Length); stream.Close(); socketcomein.Close(); return; } string report = Web_GetReport(where[1]); string head = "http/1.1 200 ok\n" + "Content-Type: text/html\n"; byte[] content = System.Text.Encoding.UTF8.GetBytes(report); head += "Content-Length:" + content.Length + "\n\n"; var headstr = System.Text.Encoding.UTF8.GetBytes(head); stream.Write(headstr, 0, headstr.Length); stream.Write(content, 0, content.Length); stream.Close(); socketcomein.Close(); } catch (Exception e) { LogInToEvent.WriteError(e.ToString()); return; } }
/// <summary> /// 用于等待web访问,web访问线程的执行方 /// </summary> void Web_WaitWebConnection() { System.Net.Sockets.TcpListener listener = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Any, PORT); try { listener.Start(); } catch (System.Net.Sockets.SocketException) { //已经被占用 LogInToEvent.WriteError("端口" + PORT.ToString() + "已经被占用"); System.Diagnostics.Process.GetCurrentProcess().Kill(); } while (true) { var comein = listener.AcceptTcpClient(); var dealing = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Web_AfterConnectionGetReportAndSendToUser)); dealing.Start(comein); } }
/// <summary> /// 如果需要的话,调度刷新。刷新线程调度项目 /// </summary> /// <param name="count">当前执行该函数的为第几个线程</param> void Scan_DecideIfNeedsScanAndDispatchScan(object count) { int currItemCount = (int)count; while (true) { try { LogInToEvent.WriteDebug("试图取得待操作对象"); Datastructs.Commands.ICommand nowUsingItem = null; lock (lockServQueue) { if (!servQueue.IsEmpty()) { nowUsingItem = servQueue.Dequeue(); } } if (nowUsingItem != null) { lock (lockservItem) { servItem[currItemCount] = nowUsingItem; } //执行操作 if (nowUsingItem.IfNeedExecution) { nowUsingItem.DoCommand(); } else { System.Threading.Thread.Sleep(1000); } if (nowUsingItem.IsImmuable) { lock (lockServQueue) { servQueue.Enqueue(nowUsingItem, DEFAULT_LOW_PRI); } } lock (lockservItem) { servItem[currItemCount] = null; } } else { //等着看看 lock (lockservItem) { servItem[currItemCount] = null; } LogInToEvent.WriteDebug("取得待操作对象失败,休眠100s"); System.Threading.Thread.Sleep(100000); } } catch (Exception e) { LogInToEvent.WriteError(e.ToString()); DisableGetObjects.Log.OverallLog.LogForErr(e.ToString()); } } }