1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          Nodejs + WebSocket + Vue 實現多人聊天室WebIM功能 – 第二章

          來源:互聯網轉載 時間:2024-01-29 08:27:02

          前言

          在《Nodejs + WebSocket簡單介紹及示例 - 第一章》中簡單的介紹了,Nodejs + WebSocket的使用方法及作用,今天就用它來搭建一個簡單的聊天室功能。

          1、Nodejs+WebSocket創建后臺服務器功能 2、Vue視圖層,接收后臺數據并渲染頁面 3、LocalStorage存儲會話ID等用戶信息

          vue + webpack 生成vue項目

          腳手架搭建項目也是非常好用,簡單命令即可搞定

          # vue init webpack web-im

          然后一路向下,填寫項目名稱,描述,作者等等信息,完成安裝。

          現在都可以自動安裝模塊了,當然,你可以可以到目錄下面執行npm install

          # cd web-im# npm install

          這就是整個生成后的項目結構。

          WebSocket服務端

          在項目根目錄下新建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,這個操作是判斷用戶是否是第一次進入。

          WebSocket客戶端視圖層

          <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>

          樣式方面就不做解釋了,都是非常簡單的樣式,有興趣的可以點擊最下方獲取源碼查看。

          WebSocket客戶端

          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));  })}

          向所有連接者發送消息,這樣所有連接者都能接收到消息。

          標簽:webim-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          請問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接口。雖然電源鍵和音量鍵的縫隙很小,但是久而久之也會進入很多灰塵。而且從表面看不出灰塵會...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>