程序与技术分享:BeetleX之快速构建Web多房间聊天室

简介: 程序与技术分享:BeetleX之快速构建Web多房间聊天室

其实构建一个Web多房间聊天室也并不是什么困难的技术,借助于websocket就可以轻松实现多用户在线实时通讯交互;在这里主要介绍一下在BeetleX和BeetleXjs的支持下如何让这个功能实现的更简单和高效。接下来通过使用BeetleX来一步步讲解Web多房间聊天室的具体实现。


信息逻辑


既然是多房间聊天室那它具备两个主要元素,分别是用户和房间;下面通过类来描述这两个元素:


用户


public class User


{


public string Name { get; set; }


public string Address { get; set; }


【JsonIgnore】


public ISession Session { get; set; }


【JsonIgnore】


public Room Room { get; set; }


public void Send(BeetleX.FastHttpApi.WebSockets.DataFrame frame)


{


frame.Send(Session);


}


public void Exit()


{


Room?.Exit(this);


}


}


信息描述比较简单主要包括信息用:名称,会话和房间;涉及的行为有发送信息和退出房间。


房间


public class Room


{


public string Name { get; set; }


public List Users { get; private set; } = new List();


public HttpApiServer HttpServer { get; set; }


public void Send(Command cmd)


{


cmd.Room = Name;


var frame = HttpServer.CreateDataFrame(cmd);


lock (Users)


{


foreach (var item in Users)


item.Send(frame);


}


}


public User【】 GetOnlines()


{


lock (Users)


return Users.ToArray();


}


public void Enter(User user)


{


if (user == null)


return;


if (user.Room != this)


{


user.Room?.Exit(user);


lock (Users)


Users.Add(user);


user.Room = this;


Command quit = new Command { Type = "enter",Message=$"enter room", User = user };


Send(quit);


}


}


public void Exit(User user)


{


if (user == null)


return;


lock (Users)


Users.Remove(user);


user.Room = null;


Command quit = new Command { Type = "quit", Message = $"exit room", User = user };


Send(quit);


}


}


房间信息主要包括名称和用户信息,具体行为有进房间,出房间和向房间发送信息。


服务逻辑


有了逻辑信息那就需要把这个信息通过接口的服务方式提供给外部访问操作,接下来定义一个简单的控制器类来描述相关接口服务行为


【BeetleX.FastHttpApi.Controller】


public class Home : BeetleX.FastHttpApi.IController


{


【BeetleX.FastHttpApi.NotAction】


public void Init(HttpApiServer server, string path)


{


for (int i = 0; i < 10; i++)


{


string key = $"{i:00}";


mRooms【key】 = new Room { Name = key, HttpServer = server };


}


server.HttpDisconnect += (o, e) =>


{


GetUser(e.Session)?.Exit();


};


}


private ConcurrentDictionary[span style="color: rgba(0, 0, 255, 1)">string, Room> mRooms


= new ConcurrentDictionary[span style="color: rgba(0, 0, 255, 1)">string, Room>(StringComparer.OrdinalIgnoreCase);


public object Rooms()


{


return from a in mRooms.Values orderby a.Name select new {a.Name};


}


public void Enter(string room, IHttpContext context)


{


User user = GetUser(context.Session);


mRooms.TryGetValue(room, out Room result);


result?.Enter(user);


}


public void Talk(string message, IHttpContext context)


{


if (!string.IsNullOrEmpty(message))


{


var user = GetUser(context.Session);


Command cmd = new Command { Type = "talk", Message = message, User = user };


user?.Room?.Send(cmd);


}


}


public void Login(string name, IHttpContext context)


{


User user = new User();


user.Name //代码效果参考:http://www.jhylw.com.cn/072238037.html

= name;

user.Session = context.Session;


user.Address = context.Request.RemoteIPAddress;


SetUser(context.Session, user);


}


private User GetUser(ISession session)


{


return (User)session【"user"】;


}


private void SetUser(ISession session, User user)


{


session【"user"】 = user;


}


}


Init方法


用于初始化房间信息,并绑定连接断开事件,如果用户断开了则执行用户退出房间。


Login方法


登陆到用户中


Rooms方法


获取所有房间信息


Enter方法


用户进入房间


Talk


用户向房间内发送一条消息


启动服务


当功能逻辑写好后,接下来的工作就是让这些接口部署到websocket服务中,部署的代码比较简单:


class Program


{


static void Main(string【】 args)


{


var builder = new HostBuilder()


.ConfigureServices((hostContext, services) =>


{


services.UseBeetlexHttp(o =>


{


o.LogToConsole //代码效果参考:http://www.jhylw.com.cn/483820945.html

= true;

o.ManageApiEnabled = false;


o.Port = 80;


o.SetDebug();


o.LogLevel = BeetleX.EventArgs.LogType.Warring;


},


typeof(Program).Assembly);


});


builder.Build().Run();


}


}


当服务部署后就可以专心去做前端实现的工作。


Web前端


为了更方便地和Beetlex服务整合,因此也单独针对性地封装了相应的javascript组件;除了自有封装的javascript还涉及到vuejs的使用。通过以上组件整合前端的代码相比服务端来说就更简单了,详细代码如下:


[/span>body

[/span>div id="page"

[/span>page-header

[/span>div class="container" style="margin-top:110px;"

[/span>div class="row"

[/span>ul style="list-style:none;"

[/span>li v-for="item in messages" class="message"

[/span>h4

[/span>span class="label label-success"

[/span>span class="label label-info"

[/span>span class="label label-default"


[/span>div style="padding-left:20px;"

{ {item.Message}}







[/span>page-footer :status="loginStatus" @login="onLogin($event)"


@talk="onTalk($event)" @select="onSelectRoom($event)" :rooms="getRooms.result"



[/span>script

beetlex.websocket.receive = function (r) {


page.messages.push(r);


};


beetlex.websocket.disconnect = function () {


page.loginStatus = false;


};


beetlex.useWebsocket();


var login = new beetlexAction("/Login");


var getRooms = new beetlexAction('/Rooms', null, 【】);


var enterRoom = new beetlexAction('/Enter');


var talk = new beetlexAction('/Talk');


login.requested = function (r) {


page.loginStatus = true;


};


var model = {


getRooms: getRooms,


loginStatus: false,


login: login,


talk: talk,


enterRoom: enterRoom,


messages: 【】,


};


var page = new Vue({


el: '#page',


data: model,


methods: {


onSelectRoom: function (r) {


// alert(r);


this.enterRoom.post({ room: r });


},


onLogin: function (r) {


this.login.post({ name: r });

相关文章
|
3天前
|
设计模式 前端开发 数据库
深入理解MVC设计模式:构建高效Web应用程序的基石
【7月更文挑战第4天】在软件工程领域,设计模式是解决常见问题的一系列经过验证的方法。其中,Model-View-Controller(MVC)设计模式自诞生以来,便成为了构建用户界面,特别是Web应用程序的黄金标准。MVC通过将应用程序逻辑分离为三个核心组件,提高了代码的可维护性、可扩展性和重用性。本文将深入探讨MVC设计模式的原理,并通过一个简单的代码示例展示其应用。
32 0
|
7天前
|
分布式计算 并行计算 安全
在Python Web开发中,Python的全局解释器锁(Global Interpreter Lock,简称GIL)是一个核心概念,它直接影响了Python程序在多线程环境下的执行效率和性能表现
【6月更文挑战第30天】Python的GIL是CPython中的全局锁,限制了多线程并行执行,尤其是在多核CPU上。GIL确保同一时间仅有一个线程执行Python字节码,导致CPU密集型任务时多线程无法充分利用多核,反而可能因上下文切换降低性能。然而,I/O密集型任务仍能受益于线程交替执行。为利用多核,开发者常选择多进程、异步IO或使用不受GIL限制的Python实现。在Web开发中,理解GIL对于优化并发性能至关重要。
25 0
|
5天前
|
监控 负载均衡 Java
如何设计高可用性的Java Web应用程序
如何设计高可用性的Java Web应用程序
|
5天前
|
开发框架 安全 .NET
使用VB.NET构建Web服务和REST API的指南
【7月更文挑战第2天】使用VB.NET构建Web服务和REST API的指南:从Web服务基础到ASP.NET Core实践,涵盖控制器、路由、模型绑定、安全措施(如JWT、HTTPS)及测试、部署(Azure、Docker)与监控工具。了解如何利用VB.NET在现代云环境中创建高效、安全的API。开始你的VB.NET Web服务开发之旅!**
6 1
|
6天前
|
存储 缓存 负载均衡
使用Java构建可扩展的Web应用
使用Java构建可扩展的Web应用
|
2天前
|
Java 应用服务中间件 Linux
Tomcat安装部署[单机软件],可以让用户开发的WEB应用程序,变成可以被访问的网页,Tomcat的使用需要jdk环境
Tomcat安装部署[单机软件],可以让用户开发的WEB应用程序,变成可以被访问的网页,Tomcat的使用需要jdk环境
|
5天前
|
缓存 监控 算法
构建高性能Java Web应用的技术策略
构建高性能Java Web应用的技术策略
|
6天前
|
缓存 Java 数据库
实战:构建高性能Java Web应用的技术方案
实战:构建高性能Java Web应用的技术方案
|
2天前
|
设计模式 Rust 安全
深入理解PHP 7的新特性及其对现代Web开发的影响
本文通过数据驱动的分析,探讨了PHP 7的发布如何革新了Web开发的面貌。文章首先概述了PHP 7带来的性能提升与新特性,然后通过实际案例和性能测试数据,详细讨论了这些新特性对提高代码效率、增强安全性和支持现代编程范式的具体影响。最后,文章将评估PHP 7在当前Web开发环境中的地位,并对其未来的发展做出展望。