SignalR 實現線上人數與廣播訊息 (console)

繼上篇SignalR 實現線上人數與廣播訊息的web篇之後,也來寫寫SignalR的威力不只有Web,連Console application也能通的!

上篇SignalR 實現線上人數與廣播訊息已經說明了Web之間怎麼用SignalR去傳輸資料

那是否有可能跟console application也能通呢,怎麼溝通呢?

其實是一樣的方式,也是透過server Hub跟client Hub proxy的方式去溝通,只是寫法不同罷了

如果在上一篇已經有所了解的話,那麼console 版的SignalR也可以很快上手

這一篇要寫的是,如何用console 去收網頁端的資料,為了簡便,這一篇只著墨於收線上廣播資訊以及群組廣播資訊

在上篇,線上廣播資訊以及群組廣播資訊的部份,我們在Hub裡面主要是用了這幾個function

        public void broadCastOnlineCount(int count)
        {
            Clients.All.broadCastOnlineCount(count);
        }
        public void RegisterGroup(string GroupId)
        {            
            Groups.Add(Context.ConnectionId, GroupId);     
        }
        public void SetGroupPower(string powerFlag, string GroupId)
        {            
            Clients.Group(GroupId).ResetPower(powerFlag);
        }

而我們需要的是在Client端建立Client開頭的這兩個function即可 

也就是broadCastOnlineCount, ResetPower

但在Console,我們的寫法就不像javaScript那樣了,需改變一下寫法

相對的,因為我們會用到SignalR的功能,所以在console也得用nuget去抓Microsoft.AspNet.SignalR.Client

我們希望console能自動收線上人數更新的訊息,也想收群組廣播的訊息,只做被動式的功能

主動式傳訊息的功能做法也一樣,這裡就不著墨了

 

static void Main(string[] args)
        {
            //連線SignalR Hub
            var connection = new HubConnection("http://localhost:29920/");
            IHubProxy commHub = connection.CreateHubProxy("MyPowerHub");
            //宣告function, 如同view裡面的javascript
            commHub.On("broadCastOnlineCount", userCount => Console.WriteLine("Online users:" + userCount));
            commHub.On("ResetPower", msg => Console.WriteLine("Receive message:" + msg));
            bool done = false;
            commHub.On("Exit", () => { done = true; });

            connection.Start().ContinueWith(task =>
            {
                if (!task.IsFaulted)
                    //default connect to group A
                    commHub.Invoke("registerGroup", "A");
                else
                    done = true;
            });

            string command = "";
            while (!done)
            {
                command = Console.ReadLine();
                if (command.ToUpper() == "EXIT") done = true;
            }

            connection.Stop();
}

 

不多說,馬上來看demo

參考資料

http://blog.darkthread.net/post-2012-07-10-signalr-remote-controller.aspx