使用ASP.NET SignalR构建实时聊天应用程序(C#)

本文介绍使用ASP.NET SignalR创建实时聊天应用的步骤。先创建新ASP.NET项目,安装SignalR库,接着创建Hub类并配置,再创建前端页面,最后运行应用。通过这些步骤,可利用SignalR的实时通信功能,轻松构建聊天应用。

在本文中,我们将使用ASP.NET SignalR创建一个实时聊天应用程序。SignalR是一个开源的库,它简化了在Web应用程序中实现实时功能的过程。我们将使用C#作为我们的主要编程语言。

步骤1:创建新的ASP.NET项目

首先,我们需要创建一个新的ASP.NET项目。打开Visual Studio并选择"创建新项目"。在项目模板中,选择"ASP.NET Web应用程序",并为项目指定名称。确保选择使用C#作为项目语言。

步骤2:安装SignalR

在创建项目后,我们需要安装SignalR库。右键单击项目,并选择"管理NuGet程序包"。在NuGet包管理器中搜索"Microsoft.AspNet.SignalR",并安装最新版本的SignalR。

步骤3:创建Hub类

SignalR使用Hub作为通信的中心。我们需要创建一个继承自Microsoft.AspNet.SignalR.Hub的类,并实现我们的聊天逻辑。在项目中创建一个新的C#类文件,命名为ChatHub.cs。以下是一个简单的示例:

using Microsoft.AspNet.SignalR;

public class ChatHub : Hub
{
    public void SendMessage(string user, string message)
    {
        // 将消息广播给所有客户端
        Clients.All.broadcastMessage(user, message);
    }
}

在上面的示例中,我们定义了一个名为SendMessage的方法,它接收一个用户名和一条消息作为参数。然后,我们使用Clients.All.broadcastMessage将消息广播给所有连接的客户端。

步骤4:配置SignalR

我们需要对SignalR进行一些配置,以确保它能够正常工作。打开Startup.cs文件,并在ConfigureServices方法中添加以下代码:

public void ConfigureServices(IServiceCollection services)
{
    // 添加SignalR服务
    services.AddSignalR();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 配置SignalR端点
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub");
    });
}

在上面的代码中,我们首先在ConfigureServices方法中添加了SignalR服务。然后,在Configure方法中,我们使用MapHub方法将ChatHub映射到/chathub端点。

步骤5:创建前端页面

现在,我们需要创建一个前端页面,以便用户可以发送和接收实时聊天消息。在项目中创建一个新的HTML文件,命名为chat.html。以下是一个简单的示例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>实时聊天</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.signalr/2.4.3/jquery.signalr.min.js"></script>
    <script>
        $(function () {
            // 连接SignalR服务器
            var connection = $.hubConnection('/chathub');
            var chatHubProxy = connection.createHubProxy('chatHub');

            // 定义客户端方法,用于接收服务器广播的消息
            chatHubProxy.on('broadcastMessage', function (user, message) {
                // 将消息显示在页面上
                $('#messages').append('<li><strong>' + user + '</strong>: ' + message + '</li>');
            });

            // 启动连接
            connection.start().done(function () {
                // 连接成功后,绑定发送按钮的单击事件
                $('#sendButton').click(function () {
                    // 获取用户名和消息
                    var user = $('#user').val();
                    var message = $('#message').val();

                    // 调用服务器的SendMessage方法发送消息
                    chatHubProxy.invoke('sendMessage', user, message);

                    // 清空输入框
                    $('#message').val('').focus();
                });
            });
        });
    </script>
</head>
<body>
    <h1>实时聊天</h1>
    <input type="text" id="user" placeholder="用户名" />
        <input type="text" id="message" placeholder="消息" />
        <button id="sendButton">发送</button>
    <ul id="messages"></ul>
</body>
</html>

在上面的代码中,我们使用JavaScript和jQuery编写了一个简单的聊天客户端。它通过SignalR连接到服务器,并在接收到消息时更新页面。

步骤6:运行应用程序

现在,我们已经完成了应用程序的编写和配置。点击Visual Studio中的"运行"按钮,启动应用程序。然后,通过浏览器访问http://localhost:port/chat.html(请将port替换为你的应用程序运行的端口号)。

在聊天页面中,输入用户名和消息,然后点击"发送"按钮。消息将被发送到服务器,并通过SignalR广播给所有连接的客户端。在页面上,你将看到实时更新的聊天消息。

总结

通过使用ASP.NET SignalR,我们可以轻松地构建实时聊天应用程序。SignalR提供了一个简单而强大的方法来处理实时通信,并且与ASP.NET紧密集成。希望本文能够帮助你入门并构建自己的实时聊天应用程序。

以上就是使用ASP.NET SignalR创建实时聊天应用程序的详细步骤和示例代码。祝你成功!

ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程。实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据。       SignalR类似与JavaScript实时框架,如Socket.IO。SignalR能够完成客户端向服务器的异步通信,并同时支持服务器向浏览器客户端推送事件。SignalR的连接通过日益流行的WebSockets API完成,而如果WebSockets无法使用,它会透明地回落为长轮询技术(long-polling technique)。如果开发人员想使用Signal,需要在客户端层使用像jQuery的JavaScript框架,并在服务端层使用.NET代码编写应用和服务。SignalR具有多种编程模型(PersistentConnections 和Hubs),它为开发人员提供了连接、消息接收群以及事件处理器的不同层次的访问。            SignalR显示已经可在单台机器上扩展至上万个连接,同时可以通过service bus和redis 以及sql server 实现可扩展的集群部署,具体参看Microsoft ASP.NET SignalRSignalR 包括一些针对不同功能的类库,下载安装可以看到一下几个主要项目:Microsoft.AspNet.SignalR – meta package (use this)Microsoft.AspNet.SignalR.Client – .NET 4 and WinRT clientMicrosoft.AspNet.SignalR.JS – The Javascript client.Microsoft.AspNet.SignalR.Core – Core server package with no host implementationMicrosoft.AspNet.SignalR.Hosting.AspNet – The ASP.NET hostMicrosoft.AspNet.SignalR.Hosting.Utils – utilities for signalr (signalr.exe)Microsoft.AspNet.SignalR.Redis – Redis message bus implementationMicrosoft.AspNet.SignalR.ServiceBus – Service bus message bus implementationGItHUb上的地址:https://github.com/SignalR/SignalR示例效果:安装也很简单,另外一种方式可以通过控制台安装:To install Microsoft ASP.NET SignalR, run the following command in the Package Manager ConsolePM> Install-Package Microsoft.AspNet.SignalR     ASP.NET SignalR 目前还在持续不断更新完善中,这个框架目前还没正式集成到.NET框架里。不过作为Web开发,实时同时,客户端和服务端双工通信这也是非常重要的需求。无论是传统Web网站还是移动平台,这个框架应该都会对我们的开发工作带来很大便利。SignalR Hub AuthorizationSecuring SignalR to your site’s usersScaling SignalR with RedisRunning SignalR on MonoUsing SignalR in MonoTouch and Mono for Android Apps SignalR really changes everythingReal Time Commenting using SignalR and XSLT基于SignalR的超线程上载器Asp.Net SignalR Chat Room(原创)利用SignalR实现IOS即时通讯(A篇服务端)使用SignalR实时显示淘宝买家信誉及中差评信息[Xamarin] iOS 與Android結合SignalRSignalR -- server push 利器http://www.codeproject.com/Articles/584845/SignalR-as-a-Service Pushing ETW events through SignalRComet:基于 HTTP 长连接的“服务器推”技术解析ASP.NET Signa
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Web; namespace SignalR.通讯 { public class iHub : iHubBase { public override Task OnConnected() { // 查询用户 var user = 自我意识.你们.SingleOrDefault(u => u.ContextId == Context.ConnectionId); if (user != null) return base.OnConnected(); user = new 线程(Context.ConnectionId); user.目的 += User_目的事件; 自我意识.你们.Add(user); Clients.Client(Context.ConnectionId).addMessage("请输入用户姓名 ", Context.ConnectionId); return base.OnConnected(); } private void User_目的事件(object sender, 目的事件参数 e) { var user = (线程)sender; if (e.类型 == 目的事件类型.说话) { if (user != null) { Clients.Client(user.ContextId).addMessage("电脑说:" + e.参一+ e.参二, user.ContextId); } } else if (e.类型 == 目的事件类型.学习 || e.类型 == 目的事件类型.认知) { Clients.Client(user.ContextId).doclass(e.参一, e.参二); } else if (e.类型 == 目的事件类型.意识) { Clients.Client(user.ContextId).addIdea(e.参一, e.参二); } } /// <summary> /// 获取用户名和自己的唯一编码 /// </summary> public void GetName(string 姓名) { // 查询用户。 var user = 自我意识.你们.SingleOrDefault(u => u.ContextId == Context.ConnectionId); if (user != null) { user.姓名 = 姓名; Clients.Client(Context.ConnectionId).showNameAndId(user.姓名, Context.ConnectionId); //读取用户个性数据 } GetOnlineUserList(); } public override Task OnReconnected() { // 查询用户 var user = 自我意识.你们.SingleOrDefault(u => u.ContextId == Context.ConnectionId); if (user != null) return base.OnReconnected(); user = new 线程(Context.ConnectionId); user.目的 += User_目的事件; 自我意识.你们.Add(user); //自动重新登陆 Clients.Client(Context.ConnectionId).addMessage("重新连接。。。 ", Context.ConnectionId); GetOnlineUserList(); return base.OnReconnected(); } /// <summary> /// 重写断开连接事件 /// 用户断开连接后,需要移除在线人们 /// </summary> /// <param name="stopCalled"></param> /// <returns></returns> public override Task OnDisconnected(bool stopCalled) { var user = 自我意识.你们.FirstOrDefault(u => u.ContextId == Context.ConnectionId); //判断用户是否存在,存在则删除 if (user != null) { 自我意识.你们.Remove(user); } //更新所有用户的列表 GetOnlineUserList(); return base.OnDisconnected(stopCalled); } /// <summary> /// 获取所有在线用户 /// </summary> public void GetOnlineUserList() { // var item = from a in 自我意识.人们 select new { a.印象.姓名, a.ContextId }; //var jsondata = JsonConvert.SerializeObject(item.ToList()); // Clients.All.getOnlineUserlist(jsondata);// 调用客户端的getOnlineUserlist来获得在线人们 } /// <summary> /// 发送消息 /// </summary> /// <param name="contextId">发送给用户的ContextId</param> /// <param name="message">发送的消息内容</param> public void SendMessage(string contextId, string message) { 线程 你 = 自我意识.你们.FirstOrDefault(u => u.ContextId == Context.ConnectionId); /* // 判断用户是否存在,存在则发送 if (user != null) { // 1V1 聊天,需要把消息往这2个客户端发送 // 给指定用户发送,把自己的ID传过去 // Clients.Client(contextId).addMessage(message + " " + DateTime.Now, Context.ConnectionId); // 给自己发送,把用户的ID传给自己 Clients.Client(Context.ConnectionId).addMessage(message + " " + DateTime.Now, contextId); } else { // Clients.Client(Context.ConnectionId).showMessage("该用户已离线"); } */ if (你 == null) { //重新连接 } if (.姓名.Equals(string.Empty)) { GetName(message); Clients.Client(Context.ConnectionId).addMessage("用户" + 你.姓名 + "你好", contextId); } else { Clients.Client(Context.ConnectionId).addMessage(.姓名 + ":" + message + " " + DateTime.Now, contextId); //开始正式聊天.输入(message); } } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值