日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微信互动大屏 霸屏 抢红包 源码及所需技术

發布時間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信互动大屏 霸屏 抢红包 源码及所需技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


? ? ?當時這個項目是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做的,下次有時間在寫。

? ?項目部分圖片

??

總結

以上是生活随笔為你收集整理的微信互动大屏 霸屏 抢红包 源码及所需技术的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。