private static void QueueListen() { while (true) { for (int i = 0; i < Queue.Count; i++) { try { var customer = Queue[i]; SocketP2PMessageEntity message = new SocketP2PMessageEntity(); message.Sender = customer.Sender; message.Identity = customer.Identity; message.Owner = customer.Owner; message.WeiXinNo = customer.WeiXinNo; message.OpenId = customer.OpenId; message.Data = "CHECKIDENTITY"; IIdentity id = new CustomerIdentity(); id.Comunicate(customer, message, Clients, Queue, SendToClientComplete, OutPutSystemMessage); } catch { break; } } Thread.Sleep(1000 * 60 * 5); } }
private void Send(SocketP2PMessageEntity message) { if (client != null && client.Connected) { try { LogCommonHelper.WriteLog("Ws 开始发送到服务器的数据"); byte[] buffer = this.MessageToBytes(message); List <ArraySegment <byte> > _lst = new List <ArraySegment <byte> >(); _lst.Add(new ArraySegment <byte>(buffer)); SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.RemoteEndPoint = client.RemoteEndPoint; args.Completed += new EventHandler <SocketAsyncEventArgs>(SendArgs_Completed); args.BufferList = _lst; client.SendAsync(args); Thread.Sleep(500); } catch (Exception ex) { LogCommonHelper.WriteLog("Ws Sending Message:" + ex.InnerException.Message); } } else { LogCommonHelper.WriteLog("Ws 已与服务器断开链接..."); } }
protected override void ValidateIdentity(SocketP2PEntity client, SocketP2PMessageEntity message, List <SocketP2PEntity> clients, List <SocketP2PEntity> queue, SendToClientCompleteHandler sendToClientCompleteHandler, OutPutSystemMessageHandler outPutSystemMessageHandler) { try { LogCommonHelper.WriteLog("我是客服,等待访客请求"); var PreparingMessageEntity = NewP2PMessage(); PreparingMessageEntity.Sender = null; PreparingMessageEntity.Receiver = client.Sender; PreparingMessageEntity.Identity = "SERVER"; PreparingMessageEntity.Data = string.Format("您好,客服({0}),请您等待访客请求...", client.Sender); PreparingMessageEntity.Owner = client.Owner; PreparingMessageEntity.WeiXinNo = client.WeiXinNo; PreparingMessageEntity.OpenId = client.OpenId; SendMessageToTerminal(PreparingMessageEntity, client, sendToClientCompleteHandler); } catch (SocketException ex) { client.Socket.Close(); clients.Remove(client); outPutSystemMessageHandler(ex.Message); } }
private static void OperationSocketData(int receiveLength, SocketP2PEntity client) { try { SendToClientCompleteHandler sendToClientCompleteHandler = new SendToClientCompleteHandler(SendToClientComplete); OutPutSystemMessageHandler outPutSystemMessageHandler = new OutPutSystemMessageHandler(OutPutSystemMessage); string json = Encoding.UTF8.GetString(client.Buffer, 0, receiveLength); if (string.IsNullOrEmpty(json)) { LogCommonHelper.WriteLog("p2p服务接收到数据:Null"); } else { LogCommonHelper.WriteLog("p2p服务接收到数据:" + json); SocketP2PMessageEntity message = JsonHelper.Deserialize <SocketP2PMessageEntity>(json); ManagerIdentity.Execute(client, message, Clients, Queue, sendToClientCompleteHandler, outPutSystemMessageHandler); } } catch (Exception ex) { LogCommonHelper.WriteLog("OperationSocketData:" + ex.InnerException.Message); } }
private SocketP2PMessageEntity InitEntity(byte[] buffer, int dataLength) { string strJson = Encoding.UTF8.GetString(buffer, 0, buffer.Length); SocketP2PMessageEntity entity = JsonHelper.Deserialize <SocketP2PMessageEntity>(strJson); return(entity); }
protected virtual void SendMessageToTerminal(SocketP2PMessageEntity message, SocketP2PEntity client, SendToClientCompleteHandler sendToClientCompleteHandler) { try { if (!string.IsNullOrEmpty(client.OpenId)) { LogCommonHelper.WriteLog("Identity : " + message.Identity); string data = message.Data; if (Equals(message.Identity, "CUSTOMER")) { data = string.Format("访客({0}) {1} : {2}", message.Sender, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message.Data); } string msg = "{\"touser\":\"" + client.OpenId + "\",\"msgtype\":\"text\", \"text\":{\"content\":\"" + data + "\"}}"; LogCommonHelper.WriteLog("msg:" + msg); if (!string.IsNullOrEmpty(msg)) { WxAccountService.WxAccountServiceSoapClient WxAccount = new WxAccountService.WxAccountServiceSoapClient(); WxAccountService.WxAccountEntity WxAccountEntity = WxAccount.GetByWeiXinNo(message.WeiXinNo); if (WxAccountEntity == null) { LogCommonHelper.WriteLog("WxAccount为NULL"); return; } LogCommonHelper.WriteLog("已经获取WxAccount信息"); LogCommonHelper.WriteLog("UserName : "******"Token : " + WxAccountEntity.Token); LogCommonHelper.WriteLog("AppId : " + WxAccountEntity.AppId); LogCommonHelper.WriteLog("Secret : " + WxAccountEntity.Secret); string un = WxAccountEntity.UserName; string unkey = CryptHelper.MD5(string.Format("{0}{1}", un, WxAccountEntity.Token)); string url = string.Format("{0}?key=C011&un={1}&unkey={2}", ConfigurationHelper.Get("WxUrl"), un, unkey); LogCommonHelper.WriteLog("URL:" + url); string strReply = WebHelper.GetFormWebRequest(url, "POST", "body=" + msg); } } else { string json = JsonHelper.Serialize(message); LogCommonHelper.WriteLog("发送Socket消息,内容:" + json); byte[] buffer = Encoding.UTF8.GetBytes(json); client.Socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(sendToClientCompleteHandler), client); } } catch (Exception ex) { LogCommonHelper.WriteLog("SendMessageToTerminal Exception:" + ex.InnerException.Message); } }
public void Comunicate(SocketP2PEntity client, SocketP2PMessageEntity message, List <SocketP2PEntity> clients, List <SocketP2PEntity> queue, SendToClientCompleteHandler sendToClientCompleteHandler, OutPutSystemMessageHandler outPutSystemMessageHandler) { if (string.IsNullOrEmpty(message.Receiver)) { if (Equals(message.Data, "CHECKIDENTITY")) { if (client == null) { client = new SocketP2PEntity(); } // 初始化访客端 client.Sender = message.Sender; client.Receiver = null; client.Owner = message.Owner; client.Identity = message.Identity; client.WeiXinNo = message.WeiXinNo; client.OpenId = message.OpenId; // 放入访客端集合 //if (!clients.Exists(x => x.Sender == client.Sender)) //{ // 允许多窗口对话 clients.Add(client); //} ValidateIdentity(client, message, clients, queue, sendToClientCompleteHandler, outPutSystemMessageHandler); } else { var PreparingMessageEntity = NewP2PMessage(); PreparingMessageEntity.Sender = null; PreparingMessageEntity.Receiver = client.Sender; PreparingMessageEntity.Identity = "SERVER"; PreparingMessageEntity.Data = (message.Identity == "SERVANT") ? string.Format("您好,客服({0}),请您等待访客请求后发言", client.Sender) : string.Format("您好,访客({0}),请您等待客服响应后发言", client.Sender); PreparingMessageEntity.Owner = message.Owner; PreparingMessageEntity.WeiXinNo = message.WeiXinNo; PreparingMessageEntity.OpenId = message.OpenId; SendMessageToTerminal(PreparingMessageEntity, client, sendToClientCompleteHandler); } } else { // 记录消息 var entity = SaveEntity(client, message); // 回发消息 Sending(entity, client, message, clients, queue, sendToClientCompleteHandler, outPutSystemMessageHandler); } }
public static string SetMessage(string sender, string reciever, string msgType, string dialogId, string data) { SocketP2PMessageEntity message = new SocketP2PMessageEntity(); message.Sender = sender; message.Receiver = reciever; message.MsgType = msgType; message.DialogId = dialogId; message.Data = data; string json = JsonHelper.Serialize(message); return(json); }
public static byte[] SetWillSendData(string sender, string reciever, string msgType, string dialogId, string data) { SocketP2PMessageEntity message = new SocketP2PMessageEntity(); message.Sender = sender; message.Receiver = reciever; message.MsgType = msgType; message.DialogId = dialogId; message.Data = data; string json = JsonHelper.Serialize(message); return(Encoding.UTF8.GetBytes(json)); }
private static byte[] GetWillSendDataByServer(SocketP2PEntity client, string data) { SocketP2PMessageEntity message = new SocketP2PMessageEntity(); message.Sender = ConstHelper.SERVER_ID; message.Receiver = ConstHelper.SERVER_ID; message.DialogId = ConstHelper.DIALOG_NO; message.Identity = "SERVER"; message.Data = data; string buffer = JsonHelper.Serialize(message); return(Encoding.Default.GetBytes(buffer)); }
private TEntity SaveEntity(SocketP2PEntity client, SocketP2PMessageEntity message) { TEntity entity = new TEntity(); entity.DialogContent = message.Data; entity.DialogTime = DateTime.Now; entity.FromId = message.Sender; entity.ToId = message.Receiver; //TRepository repository = new TRepository(); //repository.Add(entity); return(entity); }
public static string SetMessage(SocketP2PMessageEntity entity, string data) { SocketP2PMessageEntity message = new SocketP2PMessageEntity(); message.Sender = entity.Sender; message.Receiver = entity.Receiver; message.MsgType = entity.MsgType; message.DialogId = entity.DialogId; message.Data = data; message.Owner = entity.Owner; string json = JsonHelper.Serialize(message); return(json); }
private void Sending(TEntity entity, SocketP2PEntity client, SocketP2PMessageEntity message, List <SocketP2PEntity> clients, List <SocketP2PEntity> queue, SendToClientCompleteHandler sendToClientCompleteHandler, OutPutSystemMessageHandler outPutSystemMessageHandler) { if (message.Identity == "SERVER") { LogCommonHelper.WriteLog(string.Format("由系统发给{0}({1})的消息", message.Receiver.Length == 10 ? "访客" : "客服", message.Receiver)); SendMessageToTerminal(message, client, sendToClientCompleteHandler); } else { SendingByRuler(entity, client, message, clients, queue, sendToClientCompleteHandler, outPutSystemMessageHandler); } }
public static void Execute(SocketP2PEntity client, SocketP2PMessageEntity message, List <SocketP2PEntity> Clients, List <SocketP2PEntity> Queue, SendToClientCompleteHandler SendToClientCompleteHandler, OutPutSystemMessageHandler OutPutSystemMessageHandler) { IIdentity id = null; switch (message.Identity.ToUpper()) { case "CUSTOMER": id = new CustomerIdentity(); break; case "SERVANT": id = new ServantIdentity(); break; } id.Comunicate(client, message, Clients, Queue, SendToClientCompleteHandler, OutPutSystemMessageHandler); }
protected override void ValidateIdentity(SocketP2PEntity client, SocketP2PMessageEntity message, List <SocketP2PEntity> clients, List <SocketP2PEntity> queue, SendToClientCompleteHandler sendToClientCompleteHandler, OutPutSystemMessageHandler outPutSystemMessageHandler) { LogCommonHelper.WriteLog("开始分配客服"); LogCommonHelper.WriteLog("客户端数量:" + clients.Count); var servants = clients.Where(x => x.Identity == "SERVANT" && (x.Owner == message.Owner || x.WeiXinNo == message.WeiXinNo) && x.Receiver == null); LogCommonHelper.WriteLog("空闲的客服数量:" + servants.Count()); var servant = servants.FirstOrDefault(); bool isSuccess = false; if (servant != null) { #region ==== 随机分配客服 ==== LogCommonHelper.WriteLog("随机分配客服"); servant.Receiver = client.Sender; client.Receiver = servant.Sender; try { if (servant.Socket.Connected) { var PreparingMessageEntity = NewP2PMessage(); PreparingMessageEntity.Sender = servant.Receiver; PreparingMessageEntity.Receiver = servant.Sender; PreparingMessageEntity.Identity = "SERVER"; PreparingMessageEntity.Data = string.Format("您好,访客({0}),需要您的服务", servant.Receiver); PreparingMessageEntity.Owner = servant.Owner; PreparingMessageEntity.WeiXinNo = servant.WeiXinNo; PreparingMessageEntity.OpenId = servant.OpenId; SendMessageToTerminal(PreparingMessageEntity, servant, sendToClientCompleteHandler); isSuccess = true; if (queue.Exists(x => x.Sender == client.Sender)) { queue.Remove(client); } } } catch (SocketException ex) { servant.Socket.Close(); clients.Remove(servant); outPutSystemMessageHandler(ex.Message); return; } #endregion Thread.Sleep(500); if (isSuccess) { #region ==== 分配成功, 向访客发送消息 ==== try { LogCommonHelper.WriteLog("分配成功,向访客发送消息"); // 更新发言时间 client.LastTalkTime = DateTime.Now; // 发送消息 if (client.Socket.Connected) { var PreparingMessageEntity = NewP2PMessage(); PreparingMessageEntity.Sender = client.Receiver; PreparingMessageEntity.Receiver = client.Sender; PreparingMessageEntity.Identity = "SERVER"; PreparingMessageEntity.Data = string.Format("您好,客服({0}),正在为您服务,如果超过3分钟未发言,系统自动将您断线", client.Receiver); PreparingMessageEntity.Owner = client.Owner; PreparingMessageEntity.WeiXinNo = client.WeiXinNo; PreparingMessageEntity.OpenId = client.OpenId; SendMessageToTerminal(PreparingMessageEntity, client, sendToClientCompleteHandler); } } catch (SocketException ex) { client.Socket.Close(); clients.Remove(client); outPutSystemMessageHandler(ex.Message); } #endregion } else { #region ==== 客服已经断线 ==== try { LogCommonHelper.WriteLog("客服已经断线,请刷新后重新连接"); client.Receiver = null; client.DialogId = null; var PreparingMessageEntity = NewP2PMessage(); PreparingMessageEntity.Sender = null; PreparingMessageEntity.Receiver = client.Sender; PreparingMessageEntity.Identity = "SERVER"; PreparingMessageEntity.Data = "客服已经断线,请刷新后重新连接"; PreparingMessageEntity.Owner = client.Owner; PreparingMessageEntity.WeiXinNo = client.WeiXinNo; PreparingMessageEntity.OpenId = client.OpenId; SendMessageToTerminal(PreparingMessageEntity, client, sendToClientCompleteHandler); } catch (SocketException ex) { client.Socket.Close(); clients.Remove(client); outPutSystemMessageHandler(ex.Message); } #endregion } } else { #region ==== 客服全忙 ==== LogCommonHelper.WriteLog("客服全忙"); try { if (client.Socket.Connected) { LogCommonHelper.WriteLog("正在加入队列"); if (!queue.Exists(x => x.Sender == message.Sender)) { queue.Add(client); } int i = queue.IndexOf(client); int n = i + 1; var PreparingMessageEntity = NewP2PMessage(); PreparingMessageEntity.Sender = null; PreparingMessageEntity.Receiver = client.Sender; PreparingMessageEntity.Identity = "SERVER"; PreparingMessageEntity.Data = (i == 0) ? string.Format("抱歉,客服全忙。系统自动为您排队,队列序号{0},客服即将为您服务,请耐心等待", n, i) : string.Format("抱歉,客服全忙。系统自动为您排队,队列序号{0},您前面还有{1}人", n, i); PreparingMessageEntity.Owner = client.Owner; PreparingMessageEntity.WeiXinNo = client.WeiXinNo; PreparingMessageEntity.OpenId = client.OpenId; SendMessageToTerminal(PreparingMessageEntity, client, sendToClientCompleteHandler); } } catch (SocketException ex) { client.Socket.Close(); clients.Remove(client); outPutSystemMessageHandler(ex.Message); } #endregion } }
protected abstract void SendingByRuler(TEntity entity, SocketP2PEntity client, SocketP2PMessageEntity message, List <SocketP2PEntity> clients, List <SocketP2PEntity> queue, SendToClientCompleteHandler sendToClientCompleteHandler, OutPutSystemMessageHandler outPutSystemMessageHandler);
protected abstract void ValidateIdentity(SocketP2PEntity client, SocketP2PMessageEntity message, List <SocketP2PEntity> clients, List <SocketP2PEntity> queue, SendToClientCompleteHandler sendToClientCompleteHandler, OutPutSystemMessageHandler outPutSystemMessageHandler);
protected override void SendingByRuler(DialogInfoEntity entity, SocketP2PEntity client, SocketP2PMessageEntity message, List <SocketP2PEntity> clients, List <SocketP2PEntity> queue, SendToClientCompleteHandler sendToClientCompleteHandler, OutPutSystemMessageHandler outPutSystemMessageHandler) { if (message.Data.Replace(" ", "").ToLower() == "exitall") { LogCommonHelper.WriteLog("客服全部退出"); clients.RemoveAll(x => x.Sender == message.Sender && (x.Owner == message.Owner || x.WeiXinNo == message.WeiXinNo)); } else if (message.Data.Replace(" ", "").ToLower() == "exit") { LogCommonHelper.WriteLog(string.Format("客服({0})退出", message.Sender)); clients.RemoveAll(x => x.Sender == message.Sender && x.Receiver == message.Receiver); } else { LogCommonHelper.WriteLog("由客服发来的消息,发给访客" + message.Receiver); var customer = clients.Where(x => x.Sender == message.Receiver).FirstOrDefault(); if (customer != null) { try { LogCommonHelper.WriteLog("开始向访客发送消息"); // 记录最后通话时间 customer.LastTalkTime = DateTime.Now; var PreparingMessageEntity = NewP2PMessage(); PreparingMessageEntity.Sender = customer.Receiver; PreparingMessageEntity.Receiver = customer.Sender; PreparingMessageEntity.Data = message.Data; PreparingMessageEntity.Owner = customer.Owner; PreparingMessageEntity.Identity = "SERVANT"; PreparingMessageEntity.WeiXinNo = customer.WeiXinNo; PreparingMessageEntity.OpenId = customer.OpenId; SendMessageToTerminal(PreparingMessageEntity, customer, sendToClientCompleteHandler); } catch (SocketException ex) { client.Socket.Close(); clients.Remove(client); outPutSystemMessageHandler(ex.Message); } } else { var servant = clients.Where(x => x.Receiver == message.Receiver).FirstOrDefault(); if (servant != null) { try { LogCommonHelper.WriteLog("向客服发送访客断线的消息"); var PreparingMessageEntity = NewP2PMessage(); PreparingMessageEntity.Sender = null; PreparingMessageEntity.Receiver = servant.Sender; PreparingMessageEntity.Identity = "SERVER"; PreparingMessageEntity.Data = string.Format("访客({0})已经断线,请您等待其他的访客请求...", message.Receiver); PreparingMessageEntity.Owner = servant.Owner; PreparingMessageEntity.WeiXinNo = servant.WeiXinNo; PreparingMessageEntity.OpenId = servant.OpenId; servant.Receiver = null; SendMessageToTerminal(PreparingMessageEntity, servant, sendToClientCompleteHandler); } catch (SocketException ex) { client.Socket.Close(); clients.Remove(client); outPutSystemMessageHandler(ex.Message); } } } } }
public void SendMessageToP2PServer(SocketP2PMessageEntity entity) { LogCommonHelper.WriteLog("Ws SendMessageToP2PServer"); this.Connection(); message = entity; }
private static void AutoCutLine() { while (true) { try { var clients = from x in Clients where x.Identity == "CUSTOMER" && x.LastTalkTime != null && (DateTime.Now - (x.LastTalkTime ?? DateTime.Now)).TotalSeconds > (60 * 3) && !(from z in Queue where z.Sender == x.Sender select z).Any() select x; foreach (var client in clients) { // 通知客服 var servant = Clients.Where(x => x.Sender == client.Receiver).FirstOrDefault(); if (servant != null) { try { SocketP2PMessageEntity message = new SocketP2PMessageEntity(); message.Sender = null; message.Receiver = servant.Sender; message.Identity = "SERVER"; message.Data = string.Format("访客({0})超过3分钟未发言,系统自动断线,请等待其他访客的服务请求", servant.Receiver); message.Owner = servant.Owner; message.WeiXinNo = servant.WeiXinNo; message.OpenId = servant.OpenId; servant.Receiver = null; ServantIdentity identity = new ServantIdentity(); identity.Comunicate(servant, message, Clients, Queue, SendToClientComplete, OutPutSystemMessage); } catch (SocketException ex) { servant.Socket.Close(); Clients.Remove(servant); OutPutSystemMessage(ex.Message); } } Thread.Sleep(500); // 通知访客 try { SocketP2PMessageEntity message = new SocketP2PMessageEntity(); message.Sender = null; message.Receiver = client.Sender; message.Identity = "SERVER"; message.Data = "您有3分钟未发言,自动为您退出"; message.Owner = client.Owner; message.WeiXinNo = client.WeiXinNo; message.OpenId = client.OpenId; CustomerIdentity identity = new CustomerIdentity(); identity.Comunicate(client, message, Clients, Queue, SendToClientComplete, OutPutSystemMessage); } catch (SocketException ex) { OutPutSystemMessage(ex.Message); } finally { client.Socket.Close(); Clients.Remove(client); } } } catch { } Thread.Sleep(500); } }
protected override void SendingByRuler(DialogInfoEntity entity, SocketP2PEntity client, SocketP2PMessageEntity message, List <SocketP2PEntity> clients, List <SocketP2PEntity> queue, SendToClientCompleteHandler sendToClientCompleteHandler, OutPutSystemMessageHandler outPutSystemMessageHandler) { LogCommonHelper.WriteLog("由访客发来的消息,发给客服" + message.Receiver); var servant = clients.Where(x => x.Receiver == message.Sender).FirstOrDefault(); if (servant != null && servant.Socket.Connected) { try { client.LastTalkTime = DateTime.Now; var PreparingMessageEntity = NewP2PMessage(); PreparingMessageEntity.Sender = servant.Receiver; PreparingMessageEntity.Receiver = servant.Sender; PreparingMessageEntity.Data = message.Data; PreparingMessageEntity.Owner = servant.Owner; PreparingMessageEntity.Identity = "CUSTOMER"; PreparingMessageEntity.WeiXinNo = servant.WeiXinNo; PreparingMessageEntity.OpenId = servant.OpenId; SendMessageToTerminal(PreparingMessageEntity, servant, sendToClientCompleteHandler); } catch (SocketException ex) { client.Socket.Close(); clients.Remove(client); outPutSystemMessageHandler(ex.Message); } } else if (queue.Where(x => x.Sender == message.Sender).Any()) { try { client.LastTalkTime = DateTime.Now; int i = queue.IndexOf(client) + 1; var PreparingMessageEntity = NewP2PMessage(); PreparingMessageEntity.Sender = null; PreparingMessageEntity.Receiver = client.Sender; PreparingMessageEntity.Identity = "SERVER"; PreparingMessageEntity.Data = string.Format("您正在排队,队列序号{0},您前面还有{1}人", i, i - 1); PreparingMessageEntity.Owner = client.Owner; PreparingMessageEntity.WeiXinNo = client.WeiXinNo; PreparingMessageEntity.OpenId = client.OpenId; SendMessageToTerminal(PreparingMessageEntity, client, sendToClientCompleteHandler); } catch (SocketException ex) { client.Socket.Close(); clients.Remove(client); outPutSystemMessageHandler(ex.Message); } } else { try { var PreparingMessageEntity = NewP2PMessage(); PreparingMessageEntity.Sender = null; PreparingMessageEntity.Receiver = client.Sender; PreparingMessageEntity.Identity = "SERVER"; PreparingMessageEntity.Data = "客服已经断线,请刷新后重新连接"; PreparingMessageEntity.Owner = client.Owner; PreparingMessageEntity.WeiXinNo = client.WeiXinNo; PreparingMessageEntity.OpenId = client.OpenId; SendMessageToTerminal(PreparingMessageEntity, client, sendToClientCompleteHandler); } catch (SocketException ex) { client.Socket.Close(); clients.Remove(client); outPutSystemMessageHandler(ex.Message); } } }
private byte[] MessageToBytes(SocketP2PMessageEntity message) { return(Encoding.UTF8.GetBytes(JsonHelper.Serialize(message))); }