在做同步网页的时候,我们通常都是以广播的形式去更新,毕竟我们希望让所有用户都可以取得最新的信息;但有时候我们可能会遇到其他特殊的需求,部分的群组更新信息或是某一个特定的人更新信息(EX:档案上传的Process bar、两人之间的游戏对战…),这时候就会用到群组的特性,或是特定对象的传送。
广播
所有客户端都可以接收到此讯息,下段C#的程序代码,是由JavaScript呼叫C#传送讯息的Function
Clients 这个类别,可以选择要更新的目标客户群,去呼叫他们的JavaScript来更新页面上的信息
Clients选择All的属性,表示我们选择了所有的使用者,而接在后面的addMessage是在Client端的JavaScript的Function
广播的程序代码在网络上很容易搜寻到,所以这边不再赘述
$(function () { var chat = $.connection.chat; chat.client.addMessage = function (message) { $('#msgbox').append("<li>" + message + "</li>"); }; $("#sendmsg").click(function () { chat.server.send($("#message").val()); }); $.connection.hub.start()//{transport:"longPolling"}webSockets、longPolling、serverSentEvents、foreverFrame .done(function () { chat.server.hello(); }) .fail(function () { alert("Error connecting to realtime service"); });});
//C#public void Send(String Message){ Clients.All.addMessage(Message);}
群组
要把讯息传送到群组中,要事先向Hub注册使用者群组,之后传送给该群组的信息,才能够顺利地接收
所以在C#的程序代码中,有个Group的Function,GroupId是要传入使用者要加入的群组的名称或是代号;传送讯息时,也需要传入这个名称或代号才会对这个群组执行"广播",能接收到讯息的也只有这群组的用户而已!
所以在传送讯息的Function,多了一个群组号码的参数!Clients.Group的这个方法,会呼叫这群组的Clinet端的JavaScript去新增讯息
public void Group(String GroupId){ Groups.Add(Context.ConnectionId, GroupId); Clients.Group(GroupId).addMessage("Welcome");}public void Send(String GroupId, String Message){ Clients.Group(GroupId).addMessage(Message);}
$(function () { var chat = $.connection.chat; chat.client.addMessage = function (message) { $('#msgbox').append("<li>" + message + "</li>"); }; $("#sendmsg").click(function () { chat.server.send("A", $("#message").val()); }); $.connection.hub.start().done(function () {//webSockets、longPolling、serverSentEvents、foreverFrame chat.server.group("GroupA"); chat.server.send("da37e11c-987b-4ff5-bf7f-97c8155b469c", "hello"); // Notify other clients }) .fail(function () { alert("Error connecting to realtime service"); });});
特定对象
最后要传讯息给一个特定的用户,我们使用的是Client的函数,这个函数需要传入一个使用者个connectionid,而这组代号是一个类似GUID的编码;传送讯息给该用户需要输入他的代码,才会将讯息传送改该用户,之后只有这个用户能看到这个信息
public void SendOne(String ClientId, String Message){ Clients.Client(ClientId).addMessage(Message);}
$(function () { var chat = $.connection.chat; chat.client.addMessage = function (message) { $('#msgbox').append("<li>" + message + "</li>"); }; $("#sendmsg").click(function () { chat.server.send("A", $("#message").val()); }); $.connection.hub.start().done(function () {//webSockets、longPolling、serverSentEvents、foreverFrame chat.server.sendOne("da37e11c-987b-4ff5-bf7f-97c8155b469c", "hello"); // Notify other clients }) .fail(function () { alert("Error connecting to realtime service"); });});
后记
在写作SignalR的时候,一直在前端会有呼叫Javascript失败的时候,后来看见”<script src="/Signalr/hubs"></script>”的程序代码后,才发现原来我们在Server端的Function名称与在前端JavaScript的竟然不一样!!主要原因在于Javascript的Function名称,开头的字会是小写,而第二个字之后看C#的名字处理(若是大写,JavaScript的名称也就会是大写的),所以在这边建议大家在写SignalR的时候,可以把开头的单字都设定为小写,第二个在按照统一的命名方式处理!
联系客服