程序与技术分享: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 });

相关文章
|
5月前
|
前端开发 JavaScript 开发者
JavaScript:构建动态Web的核心力量
JavaScript:构建动态Web的核心力量
|
5月前
|
弹性计算 监控 网络安全
如何轻松使用AWS Web应用程序防火墙?
AWS WAF是Web应用防火墙,可防护常见网络攻击。通过创建Web ACL并设置规则,保护CloudFront、API网关、负载均衡器等资源。支持自定义规则与OWASP预定义规则集,结合CloudWatch实现监控日志,提升应用安全性和稳定性。
|
9月前
|
前端开发 算法 API
构建高性能图像处理Web应用:Next.js与TailwindCSS实践
本文分享了构建在线图像黑白转换工具的技术实践,涵盖技术栈选择、架构设计与性能优化。项目采用Next.js提供优秀的SSR性能和SEO支持,TailwindCSS加速UI开发,WebAssembly实现高性能图像处理算法。通过渐进式处理、WebWorker隔离及内存管理等策略,解决大图像处理性能瓶颈,并确保跨浏览器兼容性和移动设备优化。实际应用案例展示了其即时处理、高质量输出和客户端隐私保护等特点。未来计划引入WebGPU加速、AI增强等功能,进一步提升用户体验。此技术栈为Web图像处理应用提供了高效可行的解决方案。
|
安全 JavaScript 前端开发
AppSpider 7.5.020 发布 - Web 应用程序安全测试
AppSpider 7.5.020 for Windows - Web 应用程序安全测试
156 0
|
5月前
|
存储 安全 Java
如何在 Spring Web 应用程序中使用 @SessionScope 和 @RequestScope
Spring框架中的`@SessionScope`和`@RequestScope`注解用于管理Web应用中的状态。`@SessionScope`绑定HTTP会话生命周期,适用于用户特定数据,如购物车;`@RequestScope`限定于单个请求,适合无状态、线程安全的操作,如日志记录。合理选择作用域能提升应用性能与可维护性。
253 1
|
8月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
10月前
|
安全 测试技术 Linux
Acunetix v25.4 发布 - Web 应用程序安全测试
Acunetix v25.4 (Linux, Windows) - Web 应用程序安全测试
326 3
Acunetix v25.4 发布 - Web 应用程序安全测试
|
9月前
|
安全 Devops 测试技术
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
200 0
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
|
4月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
460 4
|
8月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!