/// <summary> /// 等待并获取任务结果 /// </summary> /// <param name="taskId"></param> /// <param name="e"></param> private void GetTaskWaitReslut(string taskId, HttpRequestEventArgs e, Stopwatch sw) { try { if (sw.ElapsedMilliseconds > HeartBeatSecond) { //超过心跳 则返回给客户端,以便下次继续请求 HttpResponse(e, new WSResModel(ResCode.Wait)); return; } //获取任务状态 WSResModel resModel = HandlerTaskManager.GetTaskReslut(taskId); if (resModel != null) { HttpResponse(e, resModel); } else { Thread.Sleep(50); GetTaskWaitReslut(taskId, e, sw); } } catch (Exception ex) { HttpResponse(e, new WSResModel(ResCode.Err, string.Format("服务器内部异常:{0}", ex.Message))); } }
/// <summary> /// 新消息 /// </summary> /// <param name="e"></param> protected override void OnMessage(WebSocketSharp.MessageEventArgs e) { try { LastRecvTime = DateTime.Now; if (e.IsText) { switch (e.Data) { case "HeartBeat": this.Send(Newtonsoft.Json.JsonConvert.SerializeObject(new WSResModel(ResCode.HeartBeatRes))); return; case "TaskIsExist": if (HandlerTaskManager.ContainsTask(this.TaskId)) { this.Send(Newtonsoft.Json.JsonConvert.SerializeObject(new WSResModel(ResCode.Wait))); } else { SendAndClose(new WSResModel(ResCode.Err, "任务不存在!")); } return; } } BaseHandler handler = HandlerManager.CreateHandler(PathName); if (handler == null) { SendAndClose(new WSResModel(ResCode.Err, string.Format("请求路径{0}未找到对应Handler", PathName))); return; } handler.Path = this.PathName; handler.TaskId = this.TaskId; handler.ReqIsWebSocket = true; handler.InPara = e.Data; //添加任务并执行 if (HandlerTaskManager.AddTask(handler)) { ThreadPool.QueueUserWorkItem((state) => { BaseHandler bh = state as BaseHandler; try { bh.HandlerTask(bh.InPara); } catch (Exception ex) { bh.ReturnToClient(new WSResModel(ResCode.Err, ex.Message)); } }, handler); } } catch (Exception ex) { CommonInfo.Output("WS处理消息异常:{0}", ex.Message); SendAndClose(new WSResModel(ResCode.Err, string.Format("服务器WS处理消息异常", ex.Message))); } }
/// <summary> /// 后台线程方法 /// 主要处理客户端连接 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DoWorkCheckMethod(object sender, DoWorkEventArgs e) { int timeout = HeartBeatSecond * 3;//连续3次检测无心跳 则表示客户端已死掉了 while (IsRunning) { try { _doWorkARE.Reset(); _doWorkARE.WaitOne(HeartBeatSecond); //定时清理任务 HandlerTaskManager.ClearTask(); foreach (WebSocketServiceHost host in _httpServer.WebSocketServices.Hosts) { List <IWebSocketSession> tempList = host.Sessions.Sessions.ToList(); foreach (var item in tempList) { MyWebSocketBehavior handler = item as MyWebSocketBehavior; if (handler != null) { //检测连接 if ((DateTime.Now - handler.LastRecvTime).TotalSeconds > timeout) { //断开客户端连接 CloseClientSocket(handler); } } } } } catch (Exception ex) { CommonInfo.Output("检测连接异常:{0}", ex.Message); } } }
/// <summary> /// Http请求处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _httpServer_Handler(object sender, HttpRequestEventArgs e) { try { if (string.IsNullOrWhiteSpace(e.Request.Url.AbsolutePath)) { HttpResponse(e, new WSResModel(ResCode.Err, "请求路径不存在!")); return; } string path = e.Request.Url.AbsolutePath.TrimStart('/'); string taskId = e.Request.QueryString["taskId"]; string clientVer = e.Request.QueryString["clientVer"];//客户端版本号 if (path == "TestConnect") { HttpResponse(e, new WSResModel(ResCode.OK)); return; } if (!string.IsNullOrWhiteSpace(clientVer) && CommonInfo.Version != clientVer) { HttpResponse(e, new WSResModel(ResCode.ClientAutoUpgrade, string.Format("请将客户端版本升级至{0}", clientVer))); Program.ExitAndStartAutoUpgrade(); return; } if (string.IsNullOrWhiteSpace(taskId)) { HttpResponse(e, new WSResModel(ResCode.Err, "请求参数TaskId必须!")); return; } if (path == "_getTaskReslut") { Stopwatch sw = new Stopwatch(); sw.Start(); GetTaskWaitReslut(taskId, e, sw); } else { BaseHandler handler = HandlerManager.CreateHandler(path); if (handler == null) { HttpResponse(e, new WSResModel(ResCode.Err, string.Format("请求路径{0}未找到对应Handler", path))); return; } //参数解析 string msg = string.Empty; if (e.Request.ContentLength64 > 0) { using (System.IO.StreamReader stream = new System.IO.StreamReader(e.Request.InputStream, Encoding.UTF8)) { msg = stream.ReadToEnd(); } } //断开并返回客户端 HttpResponse(e, new WSResModel(ResCode.Wait)); //线程继续处理消息 handler.Path = path; handler.TaskId = taskId; handler.ReqIsWebSocket = false; handler.InPara = msg; if (HandlerTaskManager.AddTask(handler)) { handler.HandlerTask(msg); } } } catch (Exception ex) { HttpResponse(e, new WSResModel(ResCode.Err, string.Format("服务器异常:{0}", ex.Message))); } }