微信互动大屏 霸屏 抢红包 源码及所需技术
? ? ?當時這個項目是2018年中旬的時候幫一家傳媒公司開發的,里面功能很多,但涉及到的技術點并不多,可能是客戶需要的功能比較少的原因吧。但還是相當繁瑣的,因為里面有很多功能點。
? ? ? 霸屏,搶紅包,互動,眾籌,提現,打賞,打賞動畫,代理等。
? ? ? 項目為.net 4.5,因為當時在考慮大屏與用戶要實時的保持同步,用戶與用戶要保持連接,所以沒選擇PHP(不是因為php不好,而是我們公司的技術棧為.net,只能用php做一些簡單的cms和網站,php大神勿噴)。開始想使用的是輪詢,想著有延時,而且并發上來就得炸。后來考慮長連接和H5 WebSocket,起初已經開始著手自己實現了,后來了解到微軟對此有專門的解決方案,那就是【SignalR】?,而且使用起來很簡單,穩定性也比較靠譜,會根據用戶的所處環境,自動選擇輪詢,長連接還是WebSocket。
? ? ?文章最下面是項目效果,當時客戶開展了20多家酒吧吧,巔峰的時候也就不到1000個人在線,當時用的服務器是8g,8核的,cpu沒超過30%,內存在4個G左右,可能是用戶規模還沒上來。數據庫使用的是Sql server 2008R2,iis 8.5。搶紅包這塊使用的是redis+lua腳本,比較靠譜。因為當時的霸屏會出現隊列的情況,所以也是使用的redis+lua實現的。
? ? ?設計思路就是每個酒吧,設置一個單獨的聊天室,每個用戶通過二維碼進入之后綁定進該酒吧的聊天室,聊天信息與霸屏信息推送至大屏。剛好signalr都有類型的功能,signalr怎么使用就不在復述了,網上搜下很多,這里只談下設計思路。
? ?下面是js用戶進入的代碼
$.connection.hub.qs = { nId:nid }; //后臺生成的針對酒吧唯一ID var chat = $.connection.chatHub;chatClientCore = chat.client;$.connection.hub.start().done(function () {chatServerCore = chat.server; console.log("連接成功!");});$.connection.hub.disconnected(function () {if (reConnect == undefined || reConnect==null) {reConnectServer();//重新連接} });?當用戶連接入聊天室的時候,在后臺將其加入至該酒吧的集合中
public override Task OnConnected(){ //數據連接的時候//UserInfo u = new SessionRedisHub(Context).GetLoginUser();string cid = Context.ConnectionId;//此處nid從前太連接是傳過來的參數獲取int nId = Convert.ToInt32(Context.QueryString["nId"]);Groups.Add(cid, "node_" + nId);return base.OnConnected();}?這里談到一個細節,就是如果需要私聊在連接上來的時候就得把cid給保存起來。我們項目中是使用redis做session的,具體實現細節,網上也能搜到,這里沒記錄網頁地址。這里需要著重提一下,就是自己實現的話需要在Startup.ConfigureSignalR中注冊IUserIdProvider,代碼如下
public static void ConfigureSignalR(IAppBuilder app){var userIdProvider = new MyUserFactory();GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => userIdProvider);//var config = new HubConfiguration();//app.MapSignalR("/chat",config);app.MapSignalR();}//MyUserFactory public class MyUserFactory : IUserIdProvider{/// <summary>/// 獲取當前登陸用戶存儲的sessionid/// </summary>/// <param name="request"></param>/// <returns></returns>public string GetUserId(IRequest request){string cnnId = new SessionRedis(request).SessionId;if (!string.IsNullOrEmpty(cnnId))return cnnId; return "404";}}? 發送私聊的時候直接取sessionID進行user發送就可以了
//群聊代碼ChatToNodeInfo nInfo = ChatCorrelation.GetChatNode(cId);Clients.OthersInGroup("node_" + nInfo.MNId).BPtoScreen(nInfo);//私聊代碼 Clients.User(new SessionRedisHub(Context).SessionId).test(cPageInfo); //推送大屏 IHubContext ScreenHub = GlobalHost.ConnectionManager.GetHubContext<ScreenHub>(); nInfo.PostTime = DateTime.Now.ToString("MM-dd HH:mm"); ScreenHub.Clients.Group("screen_"+nInfo.MNId).BPtoScreen(nInfo);? ?大屏和聊天室類似,就是加入的組名不能相同,因為大屏都是單方面接受推送,聊天室的內容想推送至大屏的話,只需要獲取到大屏的Hub即可完成推送。
? ?大體實現方案就是這樣,使用signal之后實現起來還是比較簡單的,具體細節還得看具體業務。
? ?搶紅包和霸屏在時間上控制都是使用redis做的,下次有時間在寫。
? ?項目部分圖片
??
總結
以上是生活随笔為你收集整理的微信互动大屏 霸屏 抢红包 源码及所需技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广州楼市:这种楼盘谨慎购买,未来难转手,
- 下一篇: DIV+CSS学习笔记总结篇