SignalR實現服務器與客戶端的實時通信

一 首先引用相關DLL

Startup文件爲SignalR的入口

複製代碼

using Microsoft.Owin;using Owin;

[assembly: OwinStartup(typeof(SignalR.Core.Startup))]namespace SignalR.Core
{    public class Startup
    {        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }

    }
}

三 一組SignalR的JS文件



四 實現具體業務的核心類文件,它需要集成Hub,需要使用特性HubName爲SignalR起個名字,以便在客戶端去調用它

複製代碼

using Microsoft.AspNet.SignalR;using Microsoft.AspNet.SignalR.Hubs;using SignalR.Core.Model;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Web;namespace SignalR.Core
{

    [HubName("UrlHub")]    public class UrlValid : Hub
    {        static List<CurrentUser> ConnectedUsers = new List<CurrentUser>();        public void Connect(string url,string userID)
        {            var id = Context.ConnectionId;if (ConnectedUsers.Count(x => x.ConnectionId == id) == 0)
            {
                ConnectedUsers.Add(new CurrentUser
                {
                    ConnectionId = id,
                    UserID = userID,
                });
                Clients.Caller.onConnected(id, userID, url);                //Clients.AllExcept(id).onNewUserConnected(id, userID);
                Clients.Client(id).onNewUserConnected(id, userID);
            }            else
            {

                Clients.Caller.onConnected(id, userID, url);
                Clients.Client(id).onExistUserConnected(id, userID);                // Clients.AllExcept(id).onExistUserConnected(id, userID);            }
        }        /// <summary>
        /// 登出        /// </summary>
        public void Exit(string userID)
        {            var id = Context.ConnectionId;   
            OnDisconnected();
            Clients.Caller.onConnected(id, userID, "");
            Clients.Client(id).onExit(id, userID);
        }        /// <summary>
        /// 斷開        /// </summary>
        /// <returns></returns>
        public override System.Threading.Tasks.Task OnDisconnected()
        {            var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);            if (item != null)
            {
                ConnectedUsers.Remove(item);                var id = Context.ConnectionId;
                Clients.All.onUserDisconnected(id, item.UserID);

            }            return base.OnDisconnected();
        }

    }
}

複製代碼

五 核心JS功能代碼片斷

複製代碼

    <!--Reference the jQuery library. -->
    <script src="/Scripts/jquery-1.8.2.min.js"></script>

    <!--Reference the SignalR library. -->
    <script src="/Scripts/jquery.signalR-1.0.0.js"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src="/signalr/hubs"></script>

    <script type="text/javascript">
        $(function () {            // Declare a proxy to reference the hub
            var chatHub = $.connection.UrlHub;
            registerClientMethods(chatHub);            // Start Hub            $.connection.hub.start().done(function () {
                registerEvents(chatHub);
            });

        });        //註冊客戶端事件        function registerEvents(chatHub) {
            $("#btn").click(function () {                var url = "dasfjasldfj";
                chatHub.server.connect(url);
            });

            $("#logOut").click(function () {
                chatHub.server.exit();
            });

        }        //註冊客戶端方法        function registerClientMethods(chatHub) {

            chatHub.client.onConnected = function (id, userID, url) {
                console.log("與服務器建立了鏈接" + url);
            }

            chatHub.client.onUserDisconnected = function (id, userID) {
                console.log("與服務器取消了鏈接");
            }

            chatHub.client.onNewUserConnected = function (id, userID) {
                alert("新用戶完成爲合法");
            }

            chatHub.client.onExistUserConnected = function (id, userID) {
                alert("用戶" + userID + "不能重複登陸");
            }

            chatHub.client.onExit = function (id, userID) {

                alert("用戶" + userID + "成功退出!");
            }

        }    </script>



靜態類

 public static class BroadCast
    {
        public static void SendAllMessage(string name, string mes)
        {
            IHubContext chat = GlobalHost.ConnectionManager.GetHubContext<Hub上下文>();
            chat.Clients.All.broadcastMessage(name, mes);
        }

    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章