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

相关文章
|
8天前
|
安全 应用服务中间件 网络安全
实战经验分享:利用免费SSL证书构建安全可靠的Web应用
本文分享了利用免费SSL证书构建安全Web应用的实战经验,涵盖选择合适的证书颁发机构、申请与获取证书、配置Web服务器、优化安全性及实际案例。帮助开发者提升应用安全性,增强用户信任。
|
25天前
|
监控 前端开发 JavaScript
使用 MERN 堆栈构建可扩展 Web 应用程序的最佳实践
使用 MERN 堆栈构建可扩展 Web 应用程序的最佳实践
30 6
|
27天前
|
存储 消息中间件 缓存
构建互联网高性能WEB系统经验总结
如何构建一个优秀的高性能、高可靠的应用系统对每一个开发者至关重要
25 2
|
1月前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
|
1月前
|
JSON 前端开发 API
使用Python和Flask构建简易Web API
使用Python和Flask构建简易Web API
|
1月前
|
消息中间件 前端开发 JavaScript
探索微前端架构:构建现代Web应用的新策略
本文探讨了微前端架构的概念、优势及实施策略,旨在解决传统单体应用难以快速迭代和团队协作的问题。微前端允许不同团队独立开发、部署应用的各部分,提升灵活性与可维护性。文中还讨论了技术栈灵活性、独立部署、团队自治等优势,并提出了定义清晰接口、使用Web组件、状态管理和样式隔离等实施策略。
|
1月前
|
JSON API 数据格式
使用Python和Flask构建简单的Web API
使用Python和Flask构建简单的Web API
|
1月前
|
缓存 安全 前端开发
构建高效Web应用的五大关键技术
【10月更文挑战第42天】在数字化浪潮中,Web应用已成为企业与用户互动的重要桥梁。本文将深入探讨提升Web应用性能和用户体验的五项核心技术,包括前端优化、后端架构设计、数据库管理、安全性增强以及API开发的最佳实践。通过这些技术的应用,开发者可以构建出更快、更稳定且更安全的Web应用,满足现代网络环境的需求。
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
166 3