SignalR指定用戶推送消息

1、首先,在MVC項目中安裝SingalR包(SingalR2.0須要.net4.5以上,VS2010能夠安裝1.1.3版本,本例爲VS2010+SignalR1.1.3)。javascript

 

打開工具—NuGet程序管理器—程序包管理器控制檯,輸入:html

Install-Package Microsoft.AspNet.SignalR-Version 1.1.3前端

 

安裝完成後,必定要閱讀彈出的txt,這裏很是重要,java

 

有兩個很重要的提示,一是在Global.asax文件中加入RouteTable.Routes.MapHubs();二是在頁面前端加入腳本<scriptsrc="~/signalr/hubs"></script>(注:本示例採用的是MVC4,MVC其餘版本有其餘的寫法,因此要讀這個readme)。jquery

2、安裝完signalr包後,咱們在項目中添加一個Home控制器以及它的View,View選擇母版頁,記得在這個頁面里加上後端

<scriptsrc="~/signalr/hubs"></script>服務器

<script src="../../Scripts/jQuery.signalR-1.1.4.min.js"type="text/JavaScript"></script>app

而後在項目中建立一個目錄,目錄裏建立Hub類文件:函數

public class WorkflowHub: Hub工具

    {

        /// <summary>

        /// 靜態用戶列表

        /// </summary>

        private IList<string> userList = UserInfo.userList;

 

        /// <summary>

        /// 用戶的connectionID與用戶名對照表

        /// </summary>

        private readonly static Dictionary<string, string>_connections = new Dictionary<string, string>();

 

       /// <summary>

       /// 發送函數,前端觸發該函數給服務器,服務器在將消息發送給前端,(Clients.All.(函數名)是全體廣播,另外Clients提供了組播,廣播排除,組播排除,指定用戶播發等等)

       /// 該函數名在前端使用時必定要注意,前端調用該函數時,函數首字母必定要小寫

       /// </summary>

       /// <param name="name1">發起者</param>

       /// <param name="name2">消息接收者</param>

        public voidSendByGroup(string name1, string name2)

        {

            //Client內爲用戶的id,是惟一的,SendMessage函數是前端函數,意思是服務器將該消息推送至前端

           Clients.Client(_connections[name2]).SendMessage("來自用戶"+name1 + " " + DateTime.Now.ToString("yyyy/MM/ddhh:mm:ss")+"的消息推送!");

        }

 

        /// <summary>

        /// 用戶上線函數

        /// </summary>

        /// <param name="name"></param>

        public voidSendLogin(string name)

        {

            if (!userList.Contains(name))

            {

               userList.Add(name);

               //這裏即是將用戶id和姓名聯繫起來

               _connections.Add(name, Context.ConnectionId); 

            }

            else

            {

               //每次登錄id會發生變化

               _connections[name] = Context.ConnectionId;

            }

            //新用戶上線,服務器廣播該用戶名

           Clients.All.loginUser(userList);

        }

}

其中

public class UserInfo

    {

        public static IList<string>userList = new List<string>();

    }

爲用戶名稱列表

 

Home的View中,Index.cshtml:

<script src="../../Scripts/jquery.signalR-1.1.4.min.js"type="text/javascript"></script>

    <!--Reference the autogenerated SignalR hub script. 注意必定別忘記寫這句,signalr生成的腳本都在這-->

    <script src="~/signalr/hubs"></script>

<h1>流程演示</h1>

<input type="hidden" id="displayname" />

<h2 id="thisname"></h2><br />

 

<select id="username" style="width:153px;">

</select>

<input id="send" type="button" value="發送" />

<div>

<h1 id="messgae"></h1>

</div>

<script type="text/javascript">

    $(function () {

 

       //前端Hub的使用,注意的是,Hub的名字是WorkflowHub,這裏使用時首字母小寫

        var work = $.connection.workflowHub;

 

        $('#displayname').val(prompt('請輸入暱稱:', ''));

        $('#thisname').text('當前用戶:'+$('#displayname').val());

 

        //對應後端的SendMessage函數,消息接收函數

       work.client.sendMessage = function(message) {

            $('#messgae').append(message + '</br>')

        };

 

        //後端SendLogin調用後,產生的loginUser回調

       work.client.loginUser = function(userlist) {

           reloadUser(userlist);

        };

 

        //hub鏈接開啓

        $.connection.hub.start().done(function () {

 

            var username = $('#displayname').val();

 

            //發送上線信息

           work.server.sendLogin(username);

 

            //點擊按鈕,發送消息

            $('#send').click(function() {

               var friend = $('#username').val();

               //調用後端函數,發送指定消息

               work.server.sendByGroup(username, friend);

            });

 

        });

    });

 

    //從新加載用戶列表

    var reloadUser = function(userlist) {

        $("#username").empty();

        for (i = 0;i < userlist.length; i++) {

            $("#username").append("<option value="+userlist[i]+">"+userlist[i]+"</option>");

        }

    }

</script>

調試執行,打開兩個網頁(若是提示signalr必須在jquery以後,就在_layout.cshtml中把jquery放前面),輸入用戶名稱,登陸後在列表中會顯示當前登陸的用戶的信息:

 

另外一個網頁中輸入李晨:

 

咱們在李晨這裏,給鄧超發送,這樣咱們就會在鄧超這裏看到推送的消息了:

相關文章
相關標籤/搜索