繼上篇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