在《Nodejs + WebSocket簡單介紹及示例 - 第一章》中簡單的介紹了,Nodejs + WebSocket的使用方法及作用,今天就用它來搭建一個簡單的聊天室功能。
1、Nodejs+WebSocket創建后臺服務器功能 2、Vue視圖層,接收后臺數據并渲染頁面 3、LocalStorage存儲會話ID等用戶信息
腳手架搭建項目也是非常好用,簡單命令即可搞定
# vue init webpack web-im
然后一路向下,填寫項目名稱,描述,作者等等信息,完成安裝。
現在都可以自動安裝模塊了,當然,你可以可以到目錄下面執行npm install
# cd web-im# npm install
這就是整個生成后的項目結構。
在項目根目錄下新建server/index.js文件。
var ws = require("nodejs-websocket");// 這里用到了moment,請大家自行安裝var moment = require('moment');console.log("開始建立連接...")let users = [];// 向所有連接的客戶端廣播function boardcast(obj) { server.connections.forEach(function(conn) { conn.sendText(JSON.stringify(obj)); })}function getDate(){ return moment().format('YYYY-MM-DD HH:mm:ss')}var server = ws.createServer(function(conn){ conn.on("text", function (obj) { obj = JSON.parse(obj); if(obj.type===1){ users.push({ nickname: obj.nickname, uid: obj.uid }); boardcast({ type: 1, date: getDate(), msg: obj.nickname+'加入聊天室', users: users, uid: obj.uid, nickname: obj.nickname }); } else { boardcast({ type: 2, date: getDate(), msg: obj.msg, uid: obj.uid, nickname: obj.nickname }); } }) conn.on("close", function (code, reason) { console.log("關閉連接") }); conn.on("error", function (code, reason) { console.log("異常關閉") });}).listen(8001)console.log("WebSocket建立完畢")
這里和《Nodejs + WebSocket簡單介紹及示例 - 第一章》大體結構相同,不同的是,這里向客戶端發送消息是用的一個方法
server.connections.forEach(function(conn) { conn.sendText(JSON.stringify(obj));})
遍歷所有連接,發送信息。
這里為什么要JSON.stringify(obj)
轉換成字符串???
那是sendText
方法只能傳入字符串,所以我們需要將我們的對象轉換一下。
同時,大家應該可以看出,在conn.on("text", ()=>{})
的時候判斷了一個從客戶端傳入的type,這個操作是判斷用戶是否是第一次進入。
<p > <c-dialog ref="loginDialog" title='請輸入你的昵稱' confirmBtn="開始聊天" @confirm="login" > <input v-model="nickname" type="text" placeholder="請輸入你的昵稱"> </c-dialog> <p > <p >聊天室</p> <p > <p : v-for="item in messageList"> <template v-if="item.type===1"> <p >{{item.msg}}</p> </template> <template v-else> <p >{{item.nickname}}</p> <p >{{item.msg}}</p> </template> </p> </p> <p > <input type="text" v-model="msg" placeholder="請輸入內容"> <button @click="send">發送</button> </p> </p></p>
樣式方面就不做解釋了,都是非常簡單的樣式,有興趣的可以點擊最下方獲取源碼查看。
export default { ... data(){ return { uid: '', nickname: '', socket: '', msg: '', messageList: [] } }, mounted() { let vm = this; let user = localStorage.getItem('WEB_IM_USER'); user = user && JSON.parse(user) || {}; vm.uid = user.uid; vm.nickname = user.nickname; if(!vm.uid){ vm.$refs.loginDialog.show() } else { vm.conWebSocket(); } document.onkeydown = function (event) { var e = event || window.event; if (e && e.keyCode == 13) { //回車鍵的鍵值為13 vm.send() } } }, methods: { send(){ if(!this.msg){ return } this.sendMessage(2, this.msg) }, sendMessage(type, msg){ this.socket.send(JSON.stringify({ uid: this.uid, type: type, nickname: this.nickname, msg: msg })); this.msg = ''; }, conWebSocket(){ let vm = this; if(window.WebSocket){ vm.socket = new WebSocket('ws://localhost:8001'); let socket = vm.socket; socket.onopen = function(e){ console.log("連接服務器成功"); if(!vm.uid){ // 生成新的用戶id,并存入localStorage vm.uid = 'web_im_' + moment().valueOf(); localStorage.setItem('WEB_IM_USER', JSON.stringify({ uid: vm.uid, nickname: vm.nickname })) vm.sendMessage(1) } } socket.onclose = function(e){ console.log("服務器關閉"); } socket.onerror = function(){ console.log("連接出錯"); } // 接收服務器的消息 socket.onmessage = function(e){ let message = JSON.parse(e.data); vm.messageList.push(message); } } }, login(){ this.$refs.loginDialog.hide() this.conWebSocket(); } }}
頁面渲染完成后,我們localStorage.getItem('WEB_IM_USER')
獲取本地存儲是否有用戶信息 1、沒有用戶信息,彈框填寫昵稱,確認開始連接,并生成一個時間戳的用戶id,存入localStorage 2、有用戶信息,直接連接 3、socket.onmessage
監聽服務器發送過來的消息,轉換成json,push到messageList
數組中,然后渲染到頁面 4、通過type
判斷是新加入用戶,還是正常發送消息,顯示到頁面 5、通過uid,判斷是否是本人發送的消息,如果是消息內容靠右顯示,其他用戶發送的消息都靠左顯示,并設置不同背景色
這樣我們就完成了一個簡單的node + websocket群聊功能,你從中學習到了什么了???
最后來一睹風采
Nodejs + WebSocket群聊功能和核心不知道大家有沒有get到了??? 其實核心代碼就是它:
function boardcast(obj) { server.connections.forEach(function(conn) { conn.sendText(JSON.stringify(obj)); })}
向所有連接者發送消息,這樣所有連接者都能接收到消息。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
請問123郵箱在哪里登陸?123企業電子郵件是一種專業的企業電子郵件。在注冊信息頁面,依次填寫您的電子郵件密碼、密碼提示問題、答案和附加代碼,然后單擊“確認”完成注冊和登錄工作。1、 與企業郵箱管理相比,企業郵箱管理功能更加強大。2、 登錄方法1。進入官方網站http://www.123.net/,右側有一個登錄窗口,選擇要登錄的用戶。2然后輸入[電子郵件地址]和[密碼],然后單擊[登錄]。三。特...
北京到上海的高鐵票多少錢一張?開往北京、上海的高鐵有47趟。查一下火車時間和票價。出發-到達-出發-到達時間-參考票價G3北京南-上海虹橋14336000-183360484小時48分鐘二等座軟座555、一等座軟座935G1北京南-上海虹橋09336000-1:484小時48分鐘二等座軟座555、一等座軟座935G21北京南-上海虹橋17336000-2133600坐高鐵,北京到上海票價是多少?開...
手機按鈕失靈了什么原因?1.手機因后臺程序太多而卡死。大家都知道Android后臺進程太多,占用內存很大。這時候手機會卡死,導致按鍵不靈敏。很多人以為是按鈕壞了,其實是系統卡住了。解決方法:清空手機中APP的緩存,關閉不必要的程序,釋放更多存儲空間。2.灰塵進入電源鍵和音量鍵之間的縫隙?;覊m經常進入手機的USB接口。雖然電源鍵和音量鍵的縫隙很小,但是久而久之也會進入很多灰塵。而且從表面看不出灰塵會...