1、概述
通過上篇史上最全面的SignalR系列教程-1、認識SignalR文章的介紹,我們對SignalR技術已經有了一個全面的了解。本篇開始就通過SignalR的典型應用的實現方式做介紹,例子雖然簡單,但麻雀雖小五臟俱全。可以以此為基礎,擴展到實際應用中。
SignalR 的實現機制與.NET WCF 或 Remoting 是相似的,都是使用遠程代理來實現。在具體使用上,有兩種不同通信模型:PersistentConnection 和 Hubs,其中 PersistentConnection 是實現了長時間的 Javascript 輪詢(類似於 Comet),Hub 是用來解決實時信息交換問題,它是利用 Javascript 動態載入執行方法實現的。SignalR 將整個連接,信息交換過程封裝得非常漂亮,客戶端與服務器端全部使用 JSON 來交換數據。
對於這兩種方式的討論,感興趣的朋友可以移步:https://stackoverflow.com/questions/9280484/signalr-why-choose-hub-vs-persistent-connection
本篇主要介紹使用SignalR的永久連接類(Persistent Connections)的實現方式來實現消息推送(廣播)功能,分別以Asp.NET MVC與控制台程序做實例演示。對於Hubs這種集線器的實現方式在下篇文章介紹。
2、SignalR的永久連接類Mvc實現
在ASP.NET MVC下實現SignalR的永久連接類非常的簡單,只需簡單4步就可以實現一個簡單的群聊功能。
2.1、 創建ASP.NET Mvc項目
2.2、安裝Nuget包
創建好項目后,要使用SignalR,需要先安裝SignalR包,可以通過程序包管理控制台輸入包安裝命令進行安裝。
Install-Package Microsoft.AspNet.SignalR
也可以使用界面方式,如下圖所示。
2.3、增加SignalR服務
規划適當的SignalR服務文件存放的文件夾,如我們放在Connections文件夾中,在此文件夾右鍵選擇新建項,我們選擇SignalR Persistent Connection Class永久連接類項。
確定后,VS會自動給我們生成對應代碼,如下:
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
namespace SignalRTestProj_1.Connections
{
public class ChatConnection : PersistentConnection
{
protected override Task OnConnected(IRequest request, string connectionId)
{
return Connection.Send(connectionId, "Welcome!");
}
protected override Task OnReceived(IRequest request, string connectionId, string data)
{
return Connection.Broadcast(data);
}
}
}
我們對代碼做適當修改,讓業務更人性化,如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace SignalRTestProj_1.Connections
{
using Microsoft.AspNet.SignalR;
public class ChatConnection : PersistentConnection
{
private static int _connections = 0;
protected override Task OnConnected(IRequest request, string connectionId)
{
Interlocked.Increment(ref _connections);
//廣播消息
Connection.Broadcast("新的連接加入,連接ID:" + connectionId + ",已有連接數:" + _connections);
return Connection.Send(connectionId, "雙向連接成功,連接ID:" + connectionId);
}
/// <summary>
/// 連接斷開
/// </summary>
protected override Task OnDisconnected(IRequest request, string connectionId, bool stopCalled)
{
Interlocked.Decrement(ref _connections);
return Connection.Broadcast(connectionId + "退出連接,已有連接數:" + _connections);
}
protected override Task OnReceived(IRequest request, string connectionId, string data)
{
var message = connectionId + "發送內容>>" + data;
return Connection.Broadcast(message);
}
}
}
2.4、啟動路由注冊
要使Signal啟作用,我們必須啟動路由注冊,要讓客戶端能找到,我們使用Owin。如下圖所示,我們添加一個Owin Start啟動類。
using Microsoft.Owin;
using Owin;
using SignalRTestProj_1.Connections;
[assembly: OwinStartup(typeof(SignalRTestProj_1.App_Start.ChartStartup))]
namespace SignalRTestProj_1.App_Start
{
public class ChartStartup
{
public void Configuration(IAppBuilder app)
{
// 有關如何配置應用程序的詳細信息,請訪問 https://go.microsoft.com/fwlink/?LinkID=316888
// 配置上文實現的ChatConnections
app.MapSignalR<ChatConnection>("/Connections/ChatConnection");
}
}
}
至此,我們服務端就算搭建起來了,現在我們增加一個頁面來實現調用。
2.5、前端界面處理
前端js實現消息廣播,並實時記錄
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>SignalR永久連接類 Demo</title>
<script src="~/Scripts/jquery-3.3.1.min.js"></script>
<script src="~/Scripts/jquery.signalR-2.4.1.min.js"></script>
</head>
<body>
<div>
<h1>SignalR永久連接類 Demo</h1>
<div>
<input type="text" id="msgContext" placeholder="請輸入消息內容...." />
<button id="sendMessage" class="btn-primary">Send</button>
<ul id="messages"></ul>
</div>
<script>
var connection = $.connection("/Connections/ChatConnection");
connection.logging = true;
//客戶端接收消息
connection.received(function (data) {
$('#messages').append('<li>' + data + '</li>');
});
//連接錯誤處理
connection.error(function (err) {
alert('與服務器連接報錯:'+ err.message);
});
//連接成功
connection.start().done(function () {
$('#sendMessage').click(function () {
var val = $('#msgContext').val();
//向服務器端發送消息
connection.send(val);
});
});
</script>
</div>
</body>
</html>
OK,全面完成,F5運行看效果吧。
2.6、效果展示
3、控制台做SignalR服務端實現
除了Web實時應用之外,我們還可以用其他應用程序實現實時交互,如控制台。
只需要Install-Package Microsoft.AspNet.SignalR.Client命令,示例代碼如下:
using Microsoft.AspNet.SignalR.Client;
using static System.Console;
namespace ClientWithSignalRDemo
{
class Program
{
static void Main(string[] args)
{
var connection = new Connection("http://localhost:65309/Connections/ChatConnection");
connection.Received += WriteLine;
connection.Start().Wait();
string line;
while ((line = ReadLine()) != null)
{
connection.Send(line).Wait();
}
}
}
}
4、代碼下載
實例源碼可以移步github下載,地址:https://github.com/yonghu86/SignalRTestProj
5、參考文章
一路走來數個年頭,感謝RDIFramework.NET框架的支持者與使用者,大家可以通過下面的地址了解詳情。
RDIFramework.NET官方網站:http://www.rdiframework.net/
RDIFramework.NET官方博客:http://blog.rdiframework.net/
同時需要說明的,以后的所有技術文章以官方網站為准,歡迎大家收藏!
RDIFramework.NET框架由海南國思軟件科技有限公司專業團隊長期打造、一直在更新、一直在升級,請放心使用!
歡迎關注RDIFramework.net框架官方公眾微信(微信號:guosisoft),及時了解最新動態。
掃描二維碼立即關注