/// <summary> /// Send a message to a specific client /// </summary> /// <param name="clientPublicToken"></param> /// <param name="name"></param> /// <param name="contents"></param> public void SendMessage(string clientPublicToken, string tip, object content) { if (string.IsNullOrEmpty(clientPublicToken)) { throw new ArgumentNullException("clientPublicToken"); } if (content == null) { throw new ArgumentNullException("content"); } lock (state) { if (!publicClients.ContainsKey(clientPublicToken)) { throw CometException.CometClientDoesNotExistException(); } InProcCometClient cometClient = publicClients[clientPublicToken]; CometMessage message = new CometMessage(); message.Content = content; message.Tip = tip; message.MessageId = cometClient.NextMessageId; cometClient.NextMessageId++; cometClient.Messages.Add(message.MessageId, message); } }
private void WriteErrorToResponse(HttpContext context, object objMessage) { CometMessage errorMessage = new CometMessage(); errorMessage.Tip = "aspNetComet.error"; errorMessage.MessageId = 0; errorMessage.Content = objMessage; CometMessage[] messages = new CometMessage[] { errorMessage }; DataContractJsonSerializer serializer = new DataContractJsonSerializer(messages.GetType()); serializer.WriteObject(context.Response.OutputStream, messages); context.Response.End(); }
/// <summary> /// 广播给所有用户 /// </summary> /// <param name="tip">发送提示</param> /// <param name="contents">发送内容</param> public void SendMessage(string tip, object contents) { if (contents == null) { throw new ArgumentNullException("contents"); } lock (state) { foreach (InProcCometClient cometClient in publicClients.Values) { // 将消息放进数组 CometMessage message = new CometMessage() { Tip = tip, Content = contents, MessageId = cometClient.NextMessageId }; cometClient.NextMessageId++; cometClient.Messages.Add(message.MessageId, message); } } }
// 线程核心执行函数 private void QueueCometWaitRequest_WaitCallback() { while (true) { CometWaitRequest[] processRequest; lock (state) { processRequest = WaitRequests.ToArray(); } //if (processRequest.Length == 0) // break; if (processRequest.Length == 0) { Thread.Sleep(100); } else { for (int i = 0; i < processRequest.Length; i++) { try { CometClient cometClient = StateManager.StateProvider.GetCometClient(processRequest[i].ClientPrivateToken); if (processRequest[i].Active) { Thread.Sleep(100); if (DateTime.Now.Subtract(processRequest[i].DateTimeAdded).TotalSeconds >= cometClient.ConnectionTimeoutSeconds) { DeactivateCometWaitRequest(processRequest[i]); CometMessage timeoutMessage = new CometMessage() { MessageId = 0, Tip = "aspNetComet.timeout", Content = null }; processRequest[i].Result.CometMessages = new CometMessage[] { timeoutMessage }; this.QueueCometWaitRequest_Finished(processRequest[i]); } else { // 这里是消息响应的根本,响应给客户端的是 消息数组 CometMessage[] messages = CheckForServerPushMessages(processRequest[i]); if (messages != null && messages.Length > 0) { processRequest[i].Result.CometMessages = messages; DeactivateCometWaitRequest(processRequest[i]); QueueCometWaitRequest_Finished(processRequest[i]); } } } else { // 长连接 连接超时,断网或者 离线 this.CheckForIdleCometWaitRequest(processRequest[i], cometClient); } } catch (Exception ex) { if (processRequest[i].Active) { // ok, this one has screwed up, so // we need to dequeue the request from ASP.NET, basically disable it and return // dequeue the request DeactivateCometWaitRequest(processRequest[i]); // get the message CometMessage errorMessage = new CometMessage() { MessageId = 0, Tip = "aspNetComet.error", Content = ex.Message }; // // ok, we we timeout the message processRequest[i].Result.CometMessages = new CometMessage[] { errorMessage }; // call the message QueueCometWaitRequest_Finished(processRequest[i]); } else { // this is not an active request, so we dequeue it from the // thread DequeueCometWaitRequest(processRequest[i].ClientPrivateToken); } } } } } }