


Beispielcode für die Implementierung von Echtzeit-Webchat mit SignalR
In diesem Artikel wird hauptsächlich die Verwendung von Echtzeit-Web-Chat-Beispielcode für Asp.net SignalR vorgestellt, der einen bestimmten Referenzwert hat.
Der in diesem Kapitel mit Ihnen geteilte Inhalt dient zur Verwendung Das Signal R-Framework erstellt eine einfache Gruppenchat-Funktion. Es erklärt hauptsächlich die Verwendung dieses Frameworks in .Nets MVC. Da dieses Projekt über offizielle Dokumente verfügt (natürlich alle auf Englisch), werde ich später keinen Sharing-Artikel schreiben ist, Freunde zu lassen Wir haben eine weitere Lösung, wenn wir Web-Echtzeitkommunikation verwenden müssen. Dies ist schließlich eine der von Microsoft geförderten Lösungen.
SignalR Online-Einführung
ASP.NET SignalR ist eine Bibliothek für ASP.NET-Entwickler, die Entwicklern die Integration von Echtzeit-Web erleichtern kann Der Prozess des Hinzufügens von Funktionalität zu einer Anwendung. Echtzeit-Webfunktionen sind Funktionen, bei denen Servercode Inhalte an verbundene Clients weiterleiten kann, sobald diese verfügbar sind, anstatt dass der Server darauf warten muss, dass Clients neue Daten anfordern.
Natürlich bietet SignalR auch eine sehr einfache und benutzerfreundliche High-Level-API, die es dem Server ermöglicht, JavaScript-Funktionen auf dem Client einzeln oder in Stapeln aufzurufen, und es ist sehr praktisch, Verbindungen zu verwalten B. die Verbindung des Clients mit dem Server oder die Trennung, Clientgruppierung und Clientautorisierung sind mit SignalR sehr einfach zu implementieren.
SignalR bringt Echtzeitkommunikation mit Clients zu ASP .NET. Dies ist selbstverständlich einfach zu bedienen und verfügt über eine ausreichende Skalierbarkeit. In der Vergangenheit mussten Benutzer die Seite aktualisieren oder Ajax-Polling verwenden, um eine Echtzeitanzeige der Daten zu erreichen. Jetzt können sie einfach SignalR verwenden. Das Wichtigste ist, dass Sie das Projekt nicht neu erstellen müssen, sondern SignalR nahtlos mit Ihrem vorhandenen ASP .NET-Projekt verwenden können.
Gruppenchat-Instanzeffekt
Werfen wir zunächst einen Blick auf den Effekt des Testfalls, Rendering:
Der Stil wird hier nicht berücksichtigt. Es handelt sich hier hauptsächlich um die folgenden Funktionen:
Zählen Sie die Anzahl der Online-Benutzer
2. Zeigen Sie den Spitznamen und die Verbindungsmethode der Anzahl der Personen an, die online sind (dieser Testfall unterstützt webSockets und longPolling (lange Verbindung))
3
So geht's in MVC mit SignalR Zuerst erstellen wir wie gewohnt ein MVC-Webprojekt und verwenden dann den Nuget-Konsolenbefehl: Inst
all-Paket Microsoft.AspNet.SignalR, um SignalR-Abhängigkeiten beizutreten, die automatisch hinzugefügten Pakete lauten wie folgt:
und die relevanten js-Dateien werden automatisch zum Skriptordner im MVC-Projekt hinzugefügt:<package id="Microsoft.AspNet.SignalR" version="2.2.2" targetFramework="net45" /> <package id="Microsoft.AspNet.SignalR.Core" version="2.2.2" targetFramework="net45" /> <package id="Microsoft.AspNet.SignalR.JS" version="2.2.2" targetFramework="net45" /> <package id="Microsoft.AspNet.SignalR.SystemWeb" version="2.2.2" targetFramework="net45" />
.signalR- 2.2.2.min.js
jquery.signalR-2.2.2.js
Dann brauchen wir Um eine Klasse mit dem Dateinamen Startup.cs im Verzeichnis auf Projektebene zu erstellen, kann der Hauptinhalt darin nicht vervollständigt werden:
Zuerst analysieren wir die Aufmerksamkeitspunkte von oben nach unten:[assembly: OwinStartup(typeof(Stage.Api.Extend.Startup))] namespace Stage.Api.Extend { public class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR("/chat", new Microsoft.AspNet.SignalR.HubConfiguration { EnableDetailedErrors = true, EnableJavaScriptProxies = true }); } } }
1.
Der Konstruktor OwinStartup(Type)
übergibt einen Typ, und dieser Typ entspricht der von uns erstellten Startup-Klasse, die die Startposition durch diese Konstruktorklasse markiert; 2. ist der Namespace
namespace Stage.Api.Extend
3. Die Funktion ist festgelegt und wird zuerst eingegeben Diese Methode zum Ausführen des darin enthaltenen Logikcodes ist 4 ="http://www.php.cn/wiki/188.html" target="_blank" >static
path, HubConfiguration-Konfiguration); , hier sieht es ein wenig ähnlich aus wie das public void Configuration(IAppBuilder app)
Routing
app.MapSignalR
Gehen Sie hier zum Backend. Die erforderliche Konfiguration wurde tatsächlich abgeschlossen. Das Folgende ist die spezifische Geschäftslogik-Verarbeitungsklasse, die betrieben werden muss . Erstellen Sie eine neue Klasse (hier habe ich sie ChatHub genannt) und erben Sie Hub (dies wird vom SignalR-Framework bereitgestellt) und dann darin Der Logikcode lautet wie folgt: public <a href="http://www.php.cn/wiki/188.html" target="_blank">static</a> IAppBuilder MapSignalR(this IAppBuilder builder, <a href="http://www.php.cn/wiki/57.html" target="_blank">string</a> path, HubConfiguration configuration);
public class ChatHub : Hub { // public int Num = 10001; public static List<MoHubUser> _Users = new List<MoHubUser>(); /// <summary> /// 添加聊天人 /// </summary> /// <param name="user"></param> public void AddUser(MoHubUser user) { user.Id = Context.ConnectionId; if (!_Users.Any(b => b.Id == user.Id)) { _Users.Add(user); } //Clients.All.newUser(user); Clients.All.userList(_Users); } /// <summary> /// 发送信息 /// </summary> /// <param name="user"></param> /// <param name="message"></param> public void SendAll(MoHubUser user, string message) { Clients.All.addNewMessageToPage(user, message); } /// <summary> /// 某个聊天人退出是,通知所有在线人重新加载聊天人数 /// </summary> /// <param name="stopCalled"></param> /// <returns></returns> public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled) { var user = _Users.SingleOrDefault(x => x.Id == Context.ConnectionId); if (user != null) { _Users.Remove(user); Clients.All.userList(_Users); } return base.OnDisconnected(stopCalled); } }
上面的3个方法分别做了:添加聊天人到List,发送信息到客户端,某个连接失效后通知各个有效的聊天人重新加载信息;这里值得关注的是通过重新 public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
方法来实现捕获并移除失效连接(这里是聊天人的信息);整篇测试用例通过Context.ConnectionId来保证连接的唯一性,只要有新的链接请求,那么服务端就会分配一个唯一串给这个链接,当客户端关闭页面或关闭链接这个是有就能在OnDisconnected方法中捕获到这个失效的链接的ConnectionId,这样就达到了移除失效聊天人的要求了;为了代码的方便性,这里创建了一个聊天人信息类:
public class MoHubUser { public string Id { get; set; } public string NickName { get; set; } public string TransportMethod { get; set; } }
到这里后台的聊天室代码就完成了就是这么简单;我们再来看试图中如何来写代码,这里我先给出我的html布局代码:
@{ ViewBag.Title = "神牛聊天室 - SignalR"; } <style type="text/css"> .p_left { width: 70%; float: left; } .p_right { width: 28%; float: left; } .ul { list-style: none; border: 1px solid #ccc; height: 500px; overflow-y: scroll; color: black; } .ul li { padding-top: 5px; padding-right: 25px; } .ul_user { list-style: none; } .ul_user li { padding-top: 5px; } .send { position: relative; background: #eae7e7; border-radius: 5px; /* 圆角 */ padding-top: 4px; padding-left: 5px; margin-top: 13px; } .send .arrow { position: absolute; top: -16px; font-size: 0; border: solid 8px; border-color: #fff #fff #eae7e7 #fff; } </style> <h3>@ViewBag.Title 在线人数:<span id="sapnUserTotal">0</span>人</h3> <p class="container text-left"> <p class="p_left"> <ul class="ul" id="discussion"></ul> <textarea rows="5" class="form-control" id="message" maxlength="500" placeholder="开始聊天. . ." style="max-width: 100%"></textarea><br /> <input type="button" id="sendmessage" value="发 送" class="btn btn-default" /> <input type="hidden" id="displayname" /> </p> <p class="p_right"> <ul id="users" class="ul_user"></ul> </p> </p> <script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script> @*<script src="~/chat/hubs"></script>*@
客户端这里写法大致有两种选择,一种直接使用生成的代理来操作,一种不用自动生成的代理采用手动创建代理的方式;为了内容的简洁性,这里只简单讲解下自动生成的代理方式,而更多的是分享手动创建代理链接的方式;
使用生成的代理获取链接
首先,我们需要通过Script标签来引用一下自动生成代理的路径: <script src="~/chat/hubs"></script>
,注意啦这里的路径/chat对应的就是咋们在前面Startup.cs文件中配置 app.MapSignalR("/chat"
路径,而后面/hubs固定的写法(至少目前我还没更多的试验过),只有先应用了这个~/chat/hubs,才能在后面使用生成的代理,先上段代码:
var chat = $.connection.chatHub; chat.client.newUser = function (user) { $("#users").append(' <li><strong>' + user.NickName + '[' + user.TransportMethod + ']</strong></li>'); }; chat.client.userList = function (users) { console.log(users); $("#sapnUserTotal").html(users.length); $.each(users, function (i, item) { $("#users").append(' <li>[' + item.TransportMethod + '] <strong>' + item.NickName + '</strong>(' + item.Id + ')</li>'); }); }; chat.client.addNewMessageToPage = function (user, message) { console.log(user); $("#discussion").append(' <li ><span><strong>' + user.NickName + '[' + user.TransportMethod + ']</strong>:</span><p class="send">' + message + '<p class="arrow"></p></p></li>'); }; //connection.hub.start({ transport: ['webSockets', 'longPolling'] }).done(function () { // my.TransportMethod = connection.hub.transport.name; // chat.server.addUser(my); // $('#sendmessage').click(function () { // //console.log(chat); // var content = $.trim($('#message').val()); // if (content.length <= 0) { $('#message').val('').focus(); return; } // chat.server.sendAll(my, content); // $('#message').val('').focus(); // }); //}).fail(function () { // alert("链接聊天室失败,请重新刷新页面。"); //});
咋们逐步来解析下代码注意点:
1. var chat = $.connection.chatHub;
这里的chatHub对应的就是咋们创建的并继承Hub的ChatHub类,由于js变量开头都是小写,所以这里是chatHub,这句活就表示链接到咋们后端了ChatHub类了,然后就可以使用里面的方法啦(这种有点类似于早期的webform中某种ajax请求的写法)
2. 通过chat.client.xxx来接收服务端通知的消息,而这个xxx对应的方法名称和咋们后端的Clients.All.xxx,本章实例对应的是:chat.client.userList = function (users){}对应Clients.All.userList(_Users);这样后端就能直接通知客户端的对应方法了;注意这里我后端Clients.All用的是通知全部客户端的意思,如果您需要通知指定的链接需要用到的是: T Client(string connectionId);
方法
3. chat.client是后端调用客户端,那相对的chat.server就是客户端请求服务端,和上面一样通过chat.server.xxx来指定请求的服务端方法,注意这个时候服务端方法指的是继承类Hub的子类的公共方法(本篇对应的是:chat.server.sendAll(my, content)对应ChatHub.cs文件中的 public void SendAll(MoHubUser user, string message)
函数)
4. connection.hub.start({ transport: ['webSockets', 'longPolling'] })
来指定运行的交互协议
以上就是使用生成代理的方式,按照上面的注意点来写应该不是问题;
使用手动创建反向代理来链接
不采用生成的代码的方式,我们只需要修改前端就行了,后台代码不用变或设置不用变动;首先我们把上面说的Script引用自动代理的代码去掉,因为这个时候不需要了,我们还是先上代码:
var my = { NickName: "神牛001", TransportMethod: "" }; var connection = $.hubConnection("/chat/hubs"); var chat = connection.createHubProxy('chatHub'); chat.on("userList", function (users) { console.log(users); $("#sapnUserTotal").html(users.length); $("#users").html(""); $.each(users, function (i, item) { $("#users").append(' <li>[' + item.TransportMethod + '] <strong>' + item.NickName + '</strong>(' + item.Id + ')</li>'); }); }); chat.on("addNewMessageToPage", function (user, message) { console.log(user); $("#discussion").append(' <li ><span><strong>' + user.NickName + '[' + user.TransportMethod + ']</strong>:</span><p class="send">' + message + '<p class="arrow"></p></p></li>'); var p = document.getElementById('discussion'); //p.scrollTop = p.scrollHeight; p.scrollTop = 999999; }); var nickName = prompt("请输入一个昵称:", my.NickName); my.NickName = nickName.length > 0 ? nickName : my.NickName; $('#displayname').val(nickName); $('#message').focus(); connection.start({ transport: ['webSockets', 'longPolling'] }).done(function () { my.TransportMethod = connection.transport.name; //console.log(my.TransportMethod); chat.invoke("addUser", my); $('#sendmessage').click(function () { var content = $.trim($('#message').val()); if (content.length <= 0) { $('#message').val('').focus(); return; } chat.invoke("sendAll", my, content); $('#message').val('').focus(); }); });
同样列出如下注意点:
1. var connection = $.hubConnection("/chat/hubs");
创建链接,这里的path同样对应后端的 app.MapSignalR("/chat" ,路径保持一致
2. var chat = connection.createHubProxy('chatHub');
来创建反向代理链接,这里的name:chatHub对应的是后端的ChatHub类名称
3. 通过on("xxx",function(){})函数来绑定服务端通知客户端的事件,xxx对应Clients.All.xxx中的xxx
4. connection.start({ transport: ['webSockets', 'longPolling'] })
来设置允许的链接方式,并开始链接
5. connection.transport.name来获取链接的方式名称,默认start不设置的话有这么几种:webSockets,foreverFrame,serverSentEvents,longPolling
6. chat.invoke("xxx", param1, param2) verwendet invoke, um die öffentlichen Methoden von Klassen abzubilden, die den Klassenhub erben. Die Beispiele hier entsprechen: chat.invoke("sendAll", my, content)
entspricht public void SendAll(MoHubUser user, string message)
Das obige ist der detaillierte Inhalt vonBeispielcode für die Implementierung von Echtzeit-Webchat mit SignalR. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



So erstellen Sie eine Echtzeit-Chat-Anwendung mit React und WebSocket Einführung: Mit der rasanten Entwicklung des Internets hat die Echtzeitkommunikation immer mehr Aufmerksamkeit auf sich gezogen. Live-Chat-Apps sind aus dem modernen Sozial- und Arbeitsleben nicht mehr wegzudenken. In diesem Artikel wird erläutert, wie Sie mit React und WebSocket eine einfache Echtzeit-Chat-Anwendung erstellen, und es werden spezifische Codebeispiele bereitgestellt. 1. Technische Vorbereitung Bevor wir mit der Erstellung einer Echtzeit-Chat-Anwendung beginnen, müssen wir die folgenden Technologien und Tools vorbereiten: React: eine zum Erstellen

So implementieren Sie die Echtzeit-Chat-Funktion in PHP Mit der Popularität von Social Media und Instant Messaging-Anwendungen ist die Echtzeit-Chat-Funktion zu einer Standardfunktion vieler Websites und Anwendungen geworden. In diesem Artikel werden wir zusammen mit einigen Codebeispielen untersuchen, wie Live-Chat-Funktionen mithilfe der PHP-Sprache implementiert werden. Verwendung des WebSocket-Protokolls Die Live-Chat-Funktionalität erfordert normalerweise die Verwendung des WebSocket-Protokolls, das eine bidirektionale Kommunikation zwischen dem Server und dem Client ermöglicht. In PHP können wir die Ratchet-Bibliothek verwenden, um WebSocket-Dienste zu implementieren

Echtzeit-Online-Chat mit Workerman- und HTML5-WebSocket-Technologie Einführung: Mit der rasanten Entwicklung des Internets und der Beliebtheit von Smartphones ist Echtzeit-Online-Chat zu einem unverzichtbaren Bestandteil des täglichen Lebens der Menschen geworden. Um den Bedürfnissen der Benutzer gerecht zu werden, sind Webentwickler ständig auf der Suche nach effizienteren Chat-Lösungen in Echtzeit. In diesem Artikel erfahren Sie, wie Sie das PHP-Framework Workerman und die HTML5-WebSocket-Technologie kombinieren, um ein einfaches Echtzeit-Online-Chat-System zu implementieren.

Ganz gleich, ob Sie Anfänger oder erfahrener Profi sind: Die Beherrschung von C# ebnet den Weg für Ihre Karriere.

Die Entwicklung von Technologien der künstlichen Intelligenz (KI) ist heute in vollem Gange und sie haben in verschiedenen Bereichen großes Potenzial und Einfluss gezeigt. Heute wird Dayao Ihnen 4 .NET Open-Source-KI-Modell-LLM-bezogene Projekt-Frameworks vorstellen und hofft, Ihnen einige Referenzen zu geben. https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel ist ein Open-Source-Softwareentwicklungskit (SDK), das für die Integration großer Sprachmodelle (LLM) wie OpenAI und Azure entwickelt wurde

Einführung In der sich schnell entwickelnden digitalen Welt von heute ist es von entscheidender Bedeutung, robuste, flexible und wartbare WEB-Anwendungen zu erstellen. Die PHPmvc-Architektur bietet eine ideale Lösung, um dieses Ziel zu erreichen. MVC (Model-View-Controller) ist ein weit verbreitetes Entwurfsmuster, das verschiedene Aspekte einer Anwendung in unabhängige Komponenten unterteilt. Die Grundlage der MVC-Architektur Das Kernprinzip der MVC-Architektur ist die Trennung von Belangen: Modell: Kapselt die Daten und Geschäftslogik der Anwendung. Ansicht: Verantwortlich für die Präsentation von Daten und die Abwicklung der Benutzerinteraktion. Controller: Koordiniert die Interaktion zwischen Modellen und Ansichten, verwaltet Benutzeranfragen und Geschäftslogik. PHPMVC-Architektur Die phpMVC-Architektur folgt dem traditionellen MVC-Muster, führt aber auch sprachspezifische Funktionen ein. Das Folgende ist PHPMVC

So verwenden Sie das Layui-Framework zum Entwickeln einer Echtzeit-Chat-Anwendung. Einführung: Heutzutage erfolgt die Entwicklung sozialer Netzwerke immer schneller und die Kommunikationsmethoden der Menschen haben sich allmählich von herkömmlichen Telefonanrufen und Textnachrichten auf Echtzeit-Chat verlagert. Live-Chat-Anwendungen sind aus dem Leben der Menschen nicht mehr wegzudenken und bieten eine bequeme und schnelle Möglichkeit zur Kommunikation. In diesem Artikel wird erläutert, wie Sie mit dem Layui-Framework eine Echtzeit-Chat-Anwendung entwickeln, einschließlich spezifischer Codebeispiele. 1. Wählen Sie eine geeignete Architektur. Bevor wir mit der Entwicklung beginnen, müssen wir eine geeignete Architektur zur Unterstützung von Echtzeit auswählen

Nachrichtenlesestatus und Erinnerung an ungelesene Nachrichten des PHP-Echtzeit-Chat-Systems In modernen sozialen Netzwerken und Instant-Messaging-Anwendungen sind der Nachrichtenlesestatus und die Erinnerung an ungelesene Nachrichten wesentliche Funktionen. Im PHP-Echtzeit-Chat-System können wir diese Funktionen durch einige einfache Codes implementieren. In diesem Artikel wird erläutert, wie Sie mit PHP die Funktionen „Nachrichtenlesestatus“ und „Erinnerung an ungelesene Nachrichten“ implementieren und entsprechende Codebeispiele bereitstellen. Lesestatus der Nachricht Zuerst müssen wir der Nachrichtentabelle in der Datenbank ein Feld hinzufügen, um den Lesestatus der Nachricht darzustellen.
