void socketHandler_DataArrive(object sender, DataArriveEventArgs e) { try { Trace.Write("OperatorServiceAgent Recv: " + e.Data.ToString()); processServerEvents(e); Trace.WriteLine(" [Process completed]"); } catch (Exception ex) { Trace.WriteLine("Error: processServerEvents through exception: " + ex.Message); throw; } }
void sh_DataArrive(object sender, DataArriveEventArgs e) { if (e.Data.GetType() == typeof(LoginAction)) { LoginAction action = e.Data as LoginAction; e.StateObject.OperatorId = action.OperatorId; if (operatorSocketMap.ContainsKey(action.OperatorId)) { try { if (operatorSocketMap[action.OperatorId].Connected) { sh.SendPacket(operatorSocketMap[action.OperatorId], new OperatorForceLogoffEventArgs()); operatorSocketMap[action.OperatorId].Close(); } } catch (Exception ex) { Trace.TraceError("ForceLogoff Operator " + action.OperatorId + "failed : " + ex.Message); } operatorSocketMap[action.OperatorId] = e.StateObject.workSocket; } else { operatorSocketMap.Add(action.OperatorId, e.StateObject.workSocket); } } else if (e.Data.GetType() == typeof(LogoutAction)) { LogoutAction action = e.Data as LogoutAction; if (operatorSocketMap.ContainsKey(action.OperatorId)) { operatorSocketMap[action.OperatorId] = null; } } else if (e.Data.GetType() == typeof(HeartBeatAction)) { HeartBeatAction a = e.Data as HeartBeatAction; Operator op = OperatorService.GetOperatorById(a.OperatorId); if (op != null) { op.HeartBeatTime = DateTime.Now; } } }
/// <summary> /// 收到数据包处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnDataArrive(object sender, DataArriveEventArgs e) { if (this.OnNetDataArrived != null) { var data = e.Data; try { OnNetDataArrived(sender, new NetDataArrivedEventArgs { CommunicationCode = this.CommunicationCode, Data = data, UniqueCode = e.RemoteIp, RemoteIp = e.RemoteIp, RemotePort = e.Port }); } catch (Exception ex) { string errorString = string.Format("TcpClient OnNetDataArrived 出错,UniqueCode:{0} RemoteIp{1} Data:{2} \nERROR:{3}", e.MAC, e.RemoteIp, BitConverter.ToString(e.Data), ex.ToString()); LogHelper.Error(errorString); } } }
static void sh_DataArrive(object sender, DataArriveEventArgs e) { Console.WriteLine("Recv: " + e.Data.ToString()); }
void processServerEvents(DataArriveEventArgs e) { // 客服状态改变 if (e.Data.GetType() == typeof(OperatorForceLogoffEventArgs)) { if (OperatorForceLogoff != null) { OperatorForceLogoff(this, null); } } else if (e.Data.GetType() == typeof(OperatorStatusChangeEventArgs)) { OperatorStatusChangeEventArgs os = (OperatorStatusChangeEventArgs)e.Data; Operator op = GetOperatorById(os.OperatorId); if (op != null) { op.Status = os.Status; OperatorStatusChanged(this, os); } } //访客对话请求 else if (e.Data.GetType() == typeof(VisitorChatRequestEventArgs)) { VisitorChatRequestEventArgs vc = (VisitorChatRequestEventArgs)e.Data; Visitor v = GetVisitorById(vc.VisitorId); if (v != null) { v.CurrentSession.Status = VisitSessionStatus.ChatRequesting; VisitorSessionChange(this, new VisitorSessionChangeEventArgs(v.CurrentSession)); VisitorChatRequest(this, vc); addChat(vc.Chat); } } //客服对话邀请 else if (e.Data.GetType() == typeof(OperatorChatRequestEventArgs)) { OperatorChatRequestEventArgs ocr = (OperatorChatRequestEventArgs)e.Data; Operator op = GetOperatorById(ocr.OperatorId); Visitor v = GetVisitorById(ocr.VisitorId); if (op != null && v != null) { op.Status = OperatorStatus.InviteChat; addChat(ocr.Chat); //v.CurrentSession.Status = VisitSessionStatus. //OperatorChatRequest(this, ocr); OperatorStatusChanged(this, new OperatorStatusChangeEventArgs(op.OperatorId, OperatorStatus.InviteChat)); } } // 访客对话请求被接受 else if (e.Data.GetType() == typeof(VisitorChatRequestAcceptedEventArgs)) { VisitorChatRequestAcceptedEventArgs v = e.Data as VisitorChatRequestAcceptedEventArgs; Chat chat = GetChatByChatId(v.VisitorChatRequest.Chat.ChatId); Operator op = GetOperatorById(v.VisitorChatRequest.Chat.OperatorId); Visitor visitor = GetVisitorById(v.VisitorChatRequest.VisitorId); if (chat != null && op != null && visitor != null) { chat.OperatorId = v.VisitorChatRequest.Chat.OperatorId; op.Status = OperatorStatus.Chatting; visitor.CurrentSession.OperatorId = op.OperatorId; VisitSession vs = visitor.CurrentSession; vs.ChatingTime = v.VisitorChatRequest.Chat.AcceptTime; vs.Status = VisitSessionStatus.Chatting; //VisitorChatRequestAccepted(this, (VisitorChatRequestAcceptedEventArgs)e.Data); OperatorStatusChanged(this, new OperatorStatusChangeEventArgs(v.VisitorChatRequest.Chat.OperatorId, OperatorStatus.Chatting)); VisitorSessionChange(this, new VisitorSessionChangeEventArgs(vs)); } } // 客服对话邀请被接受 else if (e.Data.GetType() == typeof(OperatorChatRequestAcceptedEventArgs)) { OperatorChatRequestAcceptedEventArgs ocr = (OperatorChatRequestAcceptedEventArgs)e.Data; Operator op = GetOperatorById(ocr.ChatRequest.OperatorId); Visitor v = GetVisitorById(ocr.ChatRequest.VisitorId); if (op != null && v != null) { op.Status = OperatorStatus.Chatting; v.CurrentSession.Status = VisitSessionStatus.Chatting; if (OperatorChatRequestAccepted != null) { OperatorChatRequestAccepted(this, (OperatorChatRequestAcceptedEventArgs)e.Data); } VisitorSessionChange(this, new VisitorSessionChangeEventArgs(v.CurrentSession)); OperatorStatusChanged(this, new OperatorStatusChangeEventArgs(op.OperatorId, op.Status)); } } // 客服对话邀请被拒绝 else if (e.Data.GetType() == typeof(OperatorChatRequestDeclinedEventArgs)) { OperatorChatRequestDeclinedEventArgs ocr = (OperatorChatRequestDeclinedEventArgs)e.Data; Operator op = GetOperatorById(ocr.ChatRequest.OperatorId); Visitor v = GetVisitorById(ocr.ChatRequest.VisitorId); Chat c = GetChatByChatId(ocr.ChatRequest.Chat.ChatId); if (op != null && v != null && c != null) { c.Status = ChatStatus.Decline; if (!IsOperatorHasActiveChat(op.OperatorId)) { op.Status = OperatorStatus.Idle; OperatorStatusChanged(this, new OperatorStatusChangeEventArgs(op.OperatorId, OperatorStatus.Idle)); } v.CurrentSession.Status = VisitSessionStatus.Visiting; VisitorSessionChange(this, new VisitorSessionChangeEventArgs(v.CurrentSession)); if (OperatorChatRequestDeclined != null) { OperatorChatRequestDeclined(this, (OperatorChatRequestDeclinedEventArgs)e.Data); } } } // 新的对话 else if (e.Data.GetType() == typeof(NewChatEventArgs)) { NewChat(this, (NewChatEventArgs)e.Data); } // 对话状态改变 else if (e.Data.GetType() == typeof(ChatStatusChangedEventArgs)) { ChatStatusChangedEventArgs cs = (ChatStatusChangedEventArgs)e.Data; Chat chat = GetChatByChatId(cs.ChatId); if (chat == null) { return; } Visitor v = GetVisitorById(chat.VisitorId); if (v == null) { return; } chat.Status = cs.Status; Operator o = GetOperatorById(chat.OperatorId); if (chat.Status == ChatStatus.Accepted) { v.CurrentSession.Status = VisitSessionStatus.Chatting; VisitorSessionChange(this, new VisitorSessionChangeEventArgs(v.CurrentSession)); o.Status = OperatorStatus.Chatting; OperatorStatusChanged(this, new OperatorStatusChangeEventArgs(chat.OperatorId, OperatorStatus.Chatting)); } else if (chat.Status == ChatStatus.Closed) { v.CurrentSession.Status = VisitSessionStatus.Visiting; VisitorSessionChange(this, new VisitorSessionChangeEventArgs(v.CurrentSession)); if (o != null && !IsOperatorHasActiveChat(chat.OperatorId)) { o.Status = OperatorStatus.Idle; OperatorStatusChanged(this, new OperatorStatusChangeEventArgs(chat.OperatorId, OperatorStatus.Idle)); } } if (ChatStatusChanged != null) { ChatStatusChanged(this, cs); } } else if (e.Data.GetType() == typeof(OperatorChatJoinInviteEventArgs)) { ChatJoinInvite(this, (OperatorChatJoinInviteEventArgs)e.Data); } else if (e.Data.GetType() == typeof(OperatorChatJoinInviteAcceptedEventArgs)) { ChatJoinInviteAccepted(this, (OperatorChatJoinInviteAcceptedEventArgs)e.Data); } else if (e.Data.GetType() == typeof(OperatorChatJoinInviteDeclinedEventArgs)) { ChatJoinInviteDeclined(this, (OperatorChatJoinInviteDeclinedEventArgs)e.Data); } // 新消息 else if (e.Data.GetType() == typeof(ChatMessageEventArgs) && NewMessage != null) { NewMessage(this, (ChatMessageEventArgs)e.Data); } // 新访问,访客可能已经存在 else if (e.Data.GetType() == typeof(NewVisitingEventArgs) && NewVisiting != null) { NewVisitingEventArgs nv = (NewVisitingEventArgs)e.Data; nv.Visitor.CurrentSession = nv.Session; Visitor v = GetVisitorById(nv.Visitor.VisitorId); if (v != null) { v.CurrentSession = nv.Session; VisitorSessionChange(this, new VisitorSessionChangeEventArgs(v.CurrentSession)); } else { addVisitor(nv.Visitor); NewVisiting(this, (NewVisitingEventArgs)e.Data); } } // 访客离开 else if (e.Data.GetType() == typeof(VisitorLeaveEventArgs)) { VisitorLeaveEventArgs vl = e.Data as VisitorLeaveEventArgs; Visitor v = GetVisitorById(vl.VisitorId); if (v != null) { v.CurrentSession.Status = VisitSessionStatus.Leave; VisitorSessionChange(this, new VisitorSessionChangeEventArgs(v.CurrentSession)); } //VisitorLeave(this, (VisitorLeaveEventArgs)e.Data); } }