摘要:同時(shí)借助實(shí)現(xiàn)在非接口中推送消息流。每分秒鐘最多的彈幕數(shù)目彈幕數(shù)量過多時(shí)優(yōu)先加載最新的。
項(xiàng)目起始原因
源于數(shù)據(jù)庫課設(shè)和以前的一次突發(fā)奇想。其實(shí)還有其他微信公眾號(hào)的彈幕系統(tǒng),但是我發(fā)現(xiàn)使用體驗(yàn)不佳,因?yàn)槟欠N彈幕系統(tǒng)都是私用,并且只支持同時(shí)進(jìn)行一個(gè)房間的使用。所以便萌生了自己寫一個(gè)的想法。(第一次寫md,有點(diǎn)不會(huì),希望諒解--)
主要技術(shù)點(diǎn)Redis(結(jié)合socket實(shí)現(xiàn)在非socket中主動(dòng)發(fā)送socket消息)
MySQL(數(shù)據(jù)持久化)
socket.io(實(shí)現(xiàn)消息實(shí)時(shí)推送)
Express(后端主要使用框架)
實(shí)現(xiàn)的主要技術(shù)點(diǎn)和難點(diǎn)接受微信服務(wù)器的消息推送
微信服務(wù)器推送的消息,我們?cè)贓xpress中通過data數(shù)據(jù)流的形式接受,然后xml轉(zhuǎn)為json格式。即得到我們需要的數(shù)據(jù)。部分代碼如下(getXml為封裝的函數(shù)用于處理數(shù)據(jù)):
// 處理上傳消息請(qǐng)求 let promise = new Promise((resolve,reject) => { let buffer = []; //監(jiān)聽 data 事件 用于接收數(shù)據(jù) req.on("data",chunk => { buffer.push(chunk); }); //監(jiān)聽 end 事件 用于處理接收完成的數(shù)據(jù) req.on("end",() => { let msgXml = Buffer.concat(buffer).toString("utf-8"); xml.xmltool.getXml(msgXml).then(datas => { resolve(JSON.stringify(datas.xml)); }).catch(e => { reject(JSON.stringify(e)); }) }) });
websocket(socket.io)
socket.io是已經(jīng)封裝好的一個(gè)庫。我們只需要安裝之后,就可方便的使用。同時(shí)借助Redis實(shí)現(xiàn)在非socket接口中推送socket消息流。需要使用到的模塊主要是:
socket.io
socket.io-redis
socket.io-emitter
部分核心代碼如下(作為一個(gè)模塊導(dǎo)出直接使用):
const redis = require("redis"); const ioRedis = require("socket.io-redis"); // var roomInfo = {}; let ioCreater = function(server) { const io = require("socket.io")(server); io.on("connection", function (socket) { var url = socket.request.headers.referer; var splited = url.split("/"); var roomID = splited[splited.length - 1]; // 獲取房間ID // var user = ""; console.log(socket.request.headers); console.log(roomID); socket.join(roomID); // 加入房間 socket.on("disconnect", function(){ //斷開socket連接的時(shí)候觸發(fā) console.log("user disconnected"); }); socket.on("message", function(){ //接收socket連接消息的時(shí)候觸發(fā) console.log("received a message"); }); socket.on("connect", function(){ //建立socket連接時(shí)候觸發(fā) console.log("connect a socket client"); }); }); io.adapter(ioRedis({host:"127.0.0.1", port:"6379" })); //使用socket.io-adapter設(shè)置緩存依賴 return io; }; module.exports = ioCreater;
多房間
在使用socket.io的時(shí)候,我們很方便的就可以創(chuàng)建socket.io多房間。我們只需要在socket連接的時(shí)候帶上參數(shù)即可。所以在初始化的時(shí)候,我們需要將房間號(hào)發(fā)到前端,前端拿到之后,創(chuàng)建相應(yīng)的socket連接即可。同時(shí)前端頁面可以直接使用node_modules里面的socket包。
彈幕實(shí)現(xiàn)
因?yàn)檎n設(shè)有時(shí)間限制的原因,所以沒有自己去手動(dòng)實(shí)現(xiàn)彈幕效果,我直接在github上面找了一個(gè)基于jQuery的彈幕插件。jQuery.danmu.js(體驗(yàn)還不錯(cuò))部分核心代碼如下:
寫在最后的話<%= title %>
代碼很粗糙,如果有參考價(jià)值的話,希望多多支持。如果有不懂得地方,請(qǐng)?zhí)岢鰜恚視?huì)盡我全力為您解答的。附上github地址,如果對(duì)您有幫助的話,希望給我一個(gè)小小的star,這是對(duì)我最大的鼓勵(lì)和支持,前端的路很長(zhǎng),我希望自己能堅(jiān)持下去!!共勉
github地址
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97974.html
摘要:官方地址支持協(xié)議用于實(shí)時(shí)通信和跨平臺(tái)的框架。如實(shí)時(shí)分析系統(tǒng)二進(jìn)制流數(shù)據(jù)處理應(yīng)用在線聊天室在線客服系統(tǒng)評(píng)論系統(tǒng)等。官方地址動(dòng)畫效果是一款優(yōu)雅的網(wǎng)頁彈幕插件支持顯示圖片文字以及超鏈接。 廢話不多說,首先上效果圖。 效果圖 showImg(https://segmentfault.com/img/bVGo0P?w=521&h=635); 用途 搞活動(dòng)、年會(huì)的時(shí)候,在大屏幕上實(shí)時(shí)顯示留言、吐...
摘要:實(shí)時(shí)彈幕使用云巴,直播平臺(tái)可快速實(shí)現(xiàn)視頻直播中發(fā)送彈幕打賞點(diǎn)贊等實(shí)時(shí)互動(dòng)功能。云巴聊天室支持圖片上傳文件發(fā)送文檔評(píng)論系統(tǒng)正式上線新增搜索功能,我們會(huì)做得更好。 SDK 篇 Android SDK 更新 Release 1.6.3后臺(tái)進(jìn)程相互拉起的特殊版本 Release 1.6.4增加 so 文件 Release 1.8.0支持小米、華為推送,無需注冊(cè)第三方賬號(hào) Release 1....
閱讀 2647·2019-08-30 15:52
閱讀 3594·2019-08-29 17:02
閱讀 1843·2019-08-29 13:00
閱讀 918·2019-08-29 11:07
閱讀 3235·2019-08-27 10:53
閱讀 1767·2019-08-26 13:43
閱讀 1011·2019-08-26 10:22
閱讀 1323·2019-08-23 18:06