zoukankan      html  css  js  c++  java
  • .NET MVC 下实现消息推送

    CometController.cs

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using CometMvcDemo.Models;
    
    namespace CometMvcDemo.Controllers
    {
        public class CometController : AsyncController
        {
            private AsyncCallback cb;
            object extraData;
            HttpContext context;
    
            //
            // GET: /Comet/
    
            public ActionResult Index()
            {
                var strUid = Request["strUid"];
                ViewData["strUid"] = strUid;
                return View();
            }
    
            //LongPolling Action 1 - 处理客户端发起的请求
            public void LongPollingAsync()
            {
                //计时器,5秒种触发一次Elapsed事件
                System.Timers.Timer timer = new System.Timers.Timer(5000);
    
                //告诉ASP.NET接下来将进行异步操作
                AsyncManager.OutstandingOperations.Increment();
    
                //订阅至计时器的Elapsed事件
                timer.Elapsed += (sender, e) =>
                {
                    //保存将要传递给LongPollingCompleted的参数
                    AsyncManager.Parameters["now"] = e.SignalTime;
    
                    //告诉ASP.NET异步操作已完成,进行LongPollingCompleted方法的调用
                    AsyncManager.OutstandingOperations.Decrement();
                };
                //启动计时器
                timer.Start();
            }
    
            //LongPolling Action 2 - 异步处理完成,向客户端发送响应
            /*
            public ActionResult LongPollingCompleted(DateTime now)
            {
                return Json(new
                {
                    d = now.ToString("MM-dd HH:mm:ss ") +
                        "-- Welcome to cnblogs.com!"
                },
                    JsonRequestBehavior.AllowGet);
            }
            */
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="context"></param>
            /// <param name="cb"></param>
            /// <param name="extraData"></param>
            /// <returns></returns>
            public void LongPollingCompleted()
            {
                //var oContext = HttpContext.Profile;
                context = System.Web.HttpContext.Current;
                string _UID = context.Request.Params["uid"];
    
                WebIMClientAsyncResult _AsyncResult = new WebIMClientAsyncResult(context,cb,null);
    
                string _Content = context.Request.Params["content"];
                string _Action = context.Request.Params["action"];
    
                if (_Action == "login")
                {
                    _UID = context.Request.Params["uid"];
                    _AsyncResult.LoginID = _UID;
                    WebIMMessageHandler.Instance().Login(_UID, _AsyncResult);
                }
                else if (_Action == "logout")
                {
                    _AsyncResult.LoginID = _UID;
                    WebIMMessageHandler.Instance().Logout(_UID, _AsyncResult);
                }
                else if (_Action == "connect")
                {
                    _AsyncResult.LoginID = _UID;
                    WebIMMessageHandler.Instance().Connect(_AsyncResult);
                }
                else if (_Action == "getuserlist")
                {
                    _AsyncResult.LoginID = _UID;
                    WebIMMessageHandler.Instance().GetUserList(_AsyncResult);
                }
                //增加消息发送
                else if (_Action == "sendmsg")
                {
    
                    _AsyncResult.LoginID = _UID;
    
                    //WebIMMessageHandler.Instance().GetUserList(_AsyncResult);
    
                    //调用
                    WebIMMessageHandler.Instance().AddMessage(_Content, _AsyncResult);
    
                }
    
                //调用
                //WebIMMessageHandler.Instance().AddMessage(_Content, _AsyncResult);
                //return _AsyncResult;
                //return Json(_AsyncResult.Content,JsonRequestBehavior.AllowGet);
            }
        }
    }

    WebIM.js

    View Code
    //登录,登录成功后,获取在线用户列表,
    function login() {
    
        //var strUrl = '/Comet/LongPolling';
    
        //$.post("comet_broadcast.asyn", { action: 'login', uid: strUid },
        $.post('/Comet/LongPolling', { action: 'login', uid: strUid },
           function (data, status) {
               if (data == "OK") {
                   _logined = true;
                   getuserlist();
               }
               else {
                   //alert(data);
                   Ext.Msg.alert("提示",data);
               }
           });
    }
    
    //获取在线用户列表,获取列表后,进入消息等待
    function getuserlist() {
        $.post('/Comet/LongPolling', { action: 'getuserlist', uid: strUid },
            function (data, status) {
                //alert('getuserlist' + data);
                var result = $("#divResult");
                result.html(result.html() + "<br/>" + "用户列表:" + data);
    
                wait();
            });
    }
    
    //退出
    function logout() {
        $.post('/Comet/LongPolling',
         { action: 'logout', uid: strUid },
            function (data, status) {
                _logined = false;
                alert(data);
            }
             );
    }
    
    //消息等待,接收到消息后显示,发起下一次的消息等待
    function wait() {
        $.post('/Comet/LongPolling', { action: 'connect', uid: strUid },
               function (data, status) {
    
                   /*
                   var result = $("#divResult");
                   result.html(result.html() + "<br/>" + "用户列表:" + data);
                   */
    
                   /*
                   //2.窗口
                   var strSubData = GetSubStrBySpecChar(data, ':');
    
                   if (strSubData == 'Msgs') {
                       new Ext.ux.ToastWindow({
                           title: '提示窗口',
                           html: data,
                           iconCls: 'error'
                       }).show(document);
                   }
                   else if (strSubData == 'Users') {
                       //暂时不处理
                   }
                   else {
    
                       new Ext.ux.ToastWindow({
                           title: '提示窗口',
                           html: data,
                           iconCls: 'error'
                       }).show(document);
                   }
    
                   //服务器返回消息,再次建立连接
                   if (_logined) {
                       wait();
                   }
                   */
    
                   new Ext.ux.ToastWindow({
                       title: '提示窗口',
                       html: 'HAHAH',
                       iconCls: 'error'
                   }).show(document);
    
                   //服务器返回消息,再次建立连接
                   if (_logined) {
                       wait();
                   }
    
               }, "html");
    }
    
    //附加事件
    ///$("#btnLogin").click(function () { if ($("#txtLoginID").val() == '') alert('空'); login(); });
    $("#btnLogout").click(function () { logout(); });
    
    /*发送消息*/
    function send() {
    
        //$.post("comet_broadcast.asyn", { action: 'sendmsg', uid: $("#txtLoginID").val(), content: $("#content").val() },
        $.post('/Comet/LongPolling', { action: 'sendmsg', uid: strUid, content: $("#content").val() },
            function (data, status) {
    
                /*
                var result = $("#divResult");
                result.html(result.html() + "<br/>" + "已发消息:" + data);
                */
    
                //发送方页面提示
                //潜规则:暂时不处理
                //2.窗口
                /*
                new Ext.ux.ToastWindow({
                title: '提示窗口',
                html: data,
                iconCls: 'error'
                }).show(document);
                */
    
            }, "html"
            );
    
        //清空内容
        $("#content").val("");
    };
    
    /**
    * 获取字符串中某个特殊字符首次出现的位置之前的子串
    */
    function GetSubStrBySpecChar(strConnStr, strSplit) {
    
        var arrStr = strConnStr.split(strSplit);
        var strSubStr = arrStr[0];
    
        return strSubStr;
    
    }
  • 相关阅读:
    docker 安装nginx 并部署 配置本地化
    vue安装tinyMCE
    gitignore文件不生效的问题解决
    docker安装Mysql挂载数据卷 实现容器配置本地化
    淘宝网店经营场所证明如何下载
    leetcode 100.相同的树
    深度优先搜索和广度优先搜索
    leetcode 329 矩阵中的最长递增路径
    leetcode 410 分割数组的最大值
    leetcode 95 不同的二叉搜索树II
  • 原文地址:https://www.cnblogs.com/lucky_hu/p/2953178.html
Copyright © 2011-2022 走看看