コード例 #1
0
ファイル: WSMain.cs プロジェクト: keguoquan/JsCallExe
 /// <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)));
     }
 }
コード例 #2
0
ファイル: WSMain.cs プロジェクト: keguoquan/JsCallExe
        /// <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)));
            }
        }
コード例 #3
0
ファイル: WSMain.cs プロジェクト: keguoquan/JsCallExe
        /// <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);
                }
            }
        }
コード例 #4
0
ファイル: WSMain.cs プロジェクト: keguoquan/JsCallExe
 /// <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)));
     }
 }