亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Websocket直播間聊天室教程  GoEasy快速實現聊天室

2024-07-21 02:03:21
字體:
來源:轉載
供稿:網友

最近兩年直播那個火啊,真的是無法形容!經常有朋友問起,我想實現一個直播間聊天或者我想開發一個聊天室, 要如何開始呢?

live-chatroom.gif

今天小編就手把手的教你用GoEasy做一個聊天室,當然也可以用于直播間內的互動。全套源碼已經開源,git地址: https://gitee.com/goeasy-io/GoEasyDemo-Live-Chatroom.git

本教程主要目的是為大家介紹實現思路,為了確保本教程能幫助到使用不同前端技術的朋友,采用了HTML + JQuery的方式,后續還會推出Uniapp(vue/nvue)和小程序版本,大家可以持續關注。

我們這次要實現的聊天室,有兩個界面,分別是:

  • 登錄界面
  • 聊天室界面

登錄

login.png

對于登錄界面,我們期望:

  • 用戶可以輸入自己的昵稱
  • 用戶可以選擇自己喜歡的頭像
  • 用戶可以選擇進入不同的聊天室(直播間)

實現步驟

登錄界面的實現,不用多說,因為真的是So Easy! 一個簡單的界面,只包含三個簡單的邏輯:

驗證是否輸入昵稱

驗證是否選擇一個頭像

根據選擇進入相應的聊天室

下邊重點講一下聊天室的實現。

聊天室(直播間)

liveroom.png

當我們進入一個聊天室后,我們期望:

  • 用戶能看到當前有多少用戶在線,這個數字能夠實時的更新
  • 用戶能看到當前在線用戶們的頭像,而且能夠實時的更新
  • 如果有用戶進入或離開聊天室
  • a. 聊天室會有“XXX進來了"或"XXX離開了"的提示
  • b. 在線用戶的數字和用戶的頭像列表會隨之自動更新
  • 用戶可以在聊天里發言
  • 用戶可以發送道具:火箭或者比心

實現步驟

第一步:聊天室界面顯示

1. 初始化:

當用戶選擇了一個聊天室,顯示聊天室界面之前,我們首先要進行以下初始化工作:

  • 初始化當前用戶currentUser,用戶id,昵稱,頭像
  • 初始化當前聊天室ID: currentRoomId
  • 初始化GoEasy對象,注意一定要加上userId參數(可以是該用戶的uuid或id等唯一標識,只有設置了userId的客戶端在上下線時,才會觸發上下線提醒)。同時需要將頭像和昵稱放入userData,當我們收到一個用戶上線提醒的時候,我們需要知道這個用戶的頭像和昵稱。
  • 初始化onlineUsers,onlineUsers是用來存放當前聊天室在線用戶數和在線用戶列表。 將當前聊天室Id (currentRoomId)作為channel,執行goEasy.hereNow查詢此刻聊天室在線用戶數和用戶列表,賦值給onlineUsers。除了在進入聊天室的時候初始化onlineUsers,當有用戶進入或離開時,也會動態的更新onlineUsers。
  • 以當前聊天室的id(currentRoomId)作為channel,執行subscriber方法監聽和接收聊天室新消息。
  • 以當前聊天室的id(currentRoomId)作為channel,執行subscriberPresence監聽用戶進入和離開事件。

參考代碼:service.js

//初始化聊天室this.joinRoom = function(userId,nickName, avatar, roomID) {  //初始化當前用戶  this.currentUser = new User(userId, nickName, avatar);  //初始化當前聊天室id  this.currentRoomId = roomID;  //初始化goeasy,建立長連接  this.goeasy = new GoEasy({   host: "hangzhou.goeasy.io",   appkey: "您的appkey",   userId: this.currentUser.id,   userData: '{"nickname":"' + this.currentUser.nickname + '","avatar":"' + this.currentUser.avatar + '"}',   onConnected: function () {    console.log( "GoEasy connect successfully.")   },   onDisconnected: function () {    console.log("GoEasy disconnected.")   }  });  //查詢當前在線用戶列表,初始化onlineUsers對象  this.initialOnlineUsers();  //監聽用戶上下線提醒,實時更新onlineUsers對象  this.subscriberPresence();  //監聽和接收新消息  this.subscriberNewMessage();};

2. 頁面展示:

完成初始化之后,就跳轉到直播間界面,在頁面上顯示以下數據:

  • 當前聊天室的名稱
  • 聊天記錄,并且顯示聊天室界面
  • 展示聊天室界面

參考代碼:controller.js

//頁面切換到聊天室界面function showChatRoom() { //更新房間名 $("#chatRoom-header").find(".current-chatRoom-name").text(loginCommand.roomName); //加載聊天歷史 var chatHistory = service.loadChatHistory(); chatHistory.forEach(function (item) {  //展示發送的消息  var otherPerson = createCurrentChatRoomPerson(item.senderNickname + ":", item.content)  $(".chatRoom-content-box").append($(otherPerson)); }); //隱藏登錄界面 $(".chat-login-box").hide(); // //顯示聊天界面 $(".chatRoom-box").show(); // //滑動到最后一行 scrollBottom();}

至此,我們已經完成了goeasy長連接的初始化,和一個聊天室靜態展示。接下來,我們一起來看看如何讓這個聊天室能夠動起來。

第二步:聊天室互動
1. 實時更新在線用戶數和頭像列表

之前在service.initialOnlineUsers方法已經初始化onlineUsers對象,但聊天室隨時都有用戶進進出出,所以我們接下來還需要能夠在有用戶上線或下線的時候能夠實時的更新onlineUsers,并且實時顯示在頁面上。 當我們收到一個用戶上線提醒,我們將新上線的用戶的信息存入在線用戶對象onlineUsers里,當有用戶離開時,在本地在線用戶列表里刪除。

參考代碼:service.js

//監聽用戶上下線時間,維護onlineUsers對象this.subscriberPresence = function() { var self = this; this.goeasy.subscribePresence({  channel: this.currentRoomId,  onPresence: function(presenceEvents) {   presenceEvents.events.forEach(function(event) {    var userId = event.userId;    var count = presenceEvents.clientAmount;    //更新onlineUsers在線用戶數    self.onlineUsers.count = count;    //如果有用戶進入聊天室    if (event.action == "join" || event.action == "online") {     var userData = JSON.parse(event.userData);     var nickName = userData.nickname;     var avatar = userData.avatar;     var user = new User(userId, nickName, avatar);     //將新用戶加入onlineUsers列表     self.onlineUsers.users.push(user);     //觸發界面的更新     self.onJoinRoom(user.nickname, user.avatar);    } else {     for (var i = 0; i < self.onlineUsers.users.length; i++) {      var leavingUser = self.onlineUsers.users[i];      if (leavingUser.id == userId) {       var nickName = leavingUser.nickname;       var avatar = leavingUser.avatar;       //將離開的用戶從onlineUsers中刪掉       self.onlineUsers.users.splice(i, 1);       //觸發界面的更新       self.onLeaveRoom(nickName, avatar);      }     }    }   });  },  onSuccess : function () {   console.log("監聽成功")  },  onFailed : function () {   console.log("監聽失敗")  } });};

2. 發送消息

  • 初始化一個chatMessage對象,包含發送方id,昵稱,消息內容,消息類型為chat
  • 將chatMessage轉換為一個Json格式的字符串
  • 調用GoEasy的Publish方法,完成消息的發送

參考代碼(service.js)

this.sendMessage = function(content) { var message = new ChatMessage(this.currentUser.id,this.currentUser.nickname, MessageType.CHAT, content); var self = this; this.goeasy.publish({  channel: self.currentRoomId,  message: JSON.stringify(message),  onSuccess: function() {   console.log("消息發布成功。");  },  onFailed: function(error) {   console.log("消息發送失敗,錯誤編碼:" + error.code + " 錯誤信息:" + error.content);  } });};

3. 接收和顯示新消息/道具

之前我們已經在初始化頁面的時候執行了service.subscriberNewMessage(),當我們收到一條消息時:

  • 根據消息類型判斷是一條聊天消息,還是一個道具
  • 如果收到的是一條聊天消息,直接顯示到界面
  • 如果是道具,就播放動畫

參考代碼(service.js)

//監聽消息或道具this.subscriberNewMessage = function() { var self = this; this.goeasy.subscribe({  channel: this.currentRoomId, //替換為您自己的channel  onMessage: function(message) {   var chatMessage = JSON.parse(message.content);   //todo:事實上不推薦在前端收到時保存, 一個用戶開多個窗口,會導致重復保存, 建議所有消息都是都在發送時在服務器端保存,這里只是為了演示   self.restapi.saveChatMessage(self.currentRoomId, chatMessage);   //如果收到的是一個消息,就顯示為消息   if (chatMessage.type == MessageType.CHAT) {    var selfSent = chatMessage.senderUserId == self.currentUser.id;    var content = JSON.parse(message.content);    self.onNewMessage(chatMessage.senderNickname, content, selfSent);   }   //如果收到的是一個道具,就播放道具動畫   if (chatMessage.type == MessageType.PROP) {    if (chatMessage.content == Prop.ROCKET) {     self.onNewRocket(chatMessage.senderNickname);    }    if (chatMessage.content == Prop.HEART) {     self.onNewHeart(chatMessage.senderNickname);    }   }  } });};

4. 發送和接收并展示道具

其實和發送消息的實現幾乎是一樣的,具體代碼請參考service.js的sendProp方法,controller.js的onNewHeart()方法。動畫的播放,使用了TweenMax這個庫,主要是為了展示一個實現思路,小編也不知道這個庫是否有很好的兼容性,以及是否能夠用在Uniapp和小程序下,知道的朋友可以留言分享給大家。

this.sendProp = function(prop) { var self = this; var message = new ChatMessage(this.currentUser.id,this.currentUser.nickname, MessageType.PROP, prop); this.goeasy.publish({  channel: self.currentRoomId,  message: JSON.stringify(message),  onSuccess: function() {   console.log("道具發布成功。");  },  onFailed: function(error) {   console.log("道具發送失敗,錯誤編碼:" + error.code + " 錯誤信息:" + error.content);  } });};

至此,一個聊天室就搞定了,是不是很簡單?

總結

到此這篇關于Websocket直播間聊天室教程 GoEasy快速實現聊天室的文章就介紹到這了,更多相關Websocket聊天室內容請搜索武林網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区在线免费视频| 日韩在线视频观看正片免费网站| 日韩电影中文字幕| 2019中文字幕在线| 欧美国产一区二区三区| 欧美大成色www永久网站婷| 2018日韩中文字幕| 国产精品www色诱视频| 欧美精品电影免费在线观看| 国产精品久久电影观看| 亚洲免费人成在线视频观看| 国产精品在线看| 欧美电影电视剧在线观看| 亚洲精品福利视频| 亚洲女人天堂av| 国产精品视频精品| 78m国产成人精品视频| 国产69精品99久久久久久宅男| 日韩欧美国产黄色| 国产精品白丝jk喷水视频一区| 高清欧美性猛交| 精品激情国产视频| 国产精品久久久久久久av电影| 亚洲香蕉成人av网站在线观看| 红桃av永久久久| 91久久久国产精品| 亚洲精品在线视频| 欧美孕妇孕交黑巨大网站| 毛片精品免费在线观看| 亚洲一区二区三区成人在线视频精品| www.日本久久久久com.| 国产中文字幕日韩| 日韩一区二区三区国产| 国产亚洲欧美视频| 亚洲国产日韩欧美在线动漫| 亚洲石原莉奈一区二区在线观看| 日韩精品免费综合视频在线播放| xvideos成人免费中文版| 亚洲天堂av网| 日韩欧亚中文在线| 国产精品久久久久久久久久久久| 91社影院在线观看| 欧美在线视频一二三| 国产精品高清在线观看| 精品久久久久久久久国产字幕| 亚洲一区二区三区香蕉| 精品国产美女在线| 这里只有精品视频| 国产精品露脸av在线| 国产狼人综合免费视频| 国内免费久久久久久久久久久| 深夜精品寂寞黄网站在线观看| 国产中文字幕91| 成人激情春色网| 国产精品一香蕉国产线看观看| 高潮白浆女日韩av免费看| 97人人爽人人喊人人模波多| 亚洲第一区在线观看| 亚洲社区在线观看| 亚洲综合av影视| 成人有码视频在线播放| 久久国产精品首页| 久久久久久高潮国产精品视| 国产热re99久久6国产精品| 国产精品久久色| 国产日韩精品在线播放| 精品国产成人av| 国产精品久久久久久久久久久久久久| 国产亚洲精品久久久久久777| 国产精品草莓在线免费观看| 91视频国产精品| 精品一区二区三区三区| 色悠悠国产精品| 欧美午夜片欧美片在线观看| 成人激情黄色网| 亚洲国产精品电影在线观看| 91亚洲精品久久久| 成人免费网站在线观看| 97在线看免费观看视频在线观看| 亚洲一区999| 日韩中文有码在线视频| 狠狠干狠狠久久| 久久久国产精品视频| 欧美亚洲成人免费| 色樱桃影院亚洲精品影院| 亚洲aⅴ日韩av电影在线观看| 亚洲欧美中文日韩在线v日本| 国产欧美精品日韩精品| 国产精品福利在线| 国产伦精品免费视频| 日韩极品精品视频免费观看| 久久精品视频亚洲| 欧美日韩成人在线播放| 欧美精品激情在线| 亚洲欧洲xxxx| 欧美一区二区色| 色哟哟亚洲精品一区二区| 91在线色戒在线| 国产精品激情自拍| 国产成人精品视频在线观看| 高清亚洲成在人网站天堂| 日韩免费黄色av| 欧美午夜宅男影院在线观看| 国产精品夫妻激情| 一区二区三区久久精品| 国产欧美精品日韩| 欧美—级高清免费播放| 亚洲色图15p| 久久综合久中文字幕青草| 精品国产福利视频| 动漫精品一区二区| 在线看片第一页欧美| 亚洲国产另类久久精品| 亚洲自拍偷拍区| 久久中文久久字幕| 亚洲女性裸体视频| 亚洲欧美日韩在线高清直播| 57pao精品| 国产一区二区三区中文| 久久综合色88| 不卡av电影在线观看| 亚洲国产天堂久久综合网| 亚洲有声小说3d| 成人av在线亚洲| 日本精品久久中文字幕佐佐木| 午夜精品久久久久久99热| 欧美日韩中文在线观看| 日本成人在线视频网址| 日韩av在线免播放器| 亚洲精品久久久久国产| 久久精品国产免费观看| 最新日韩中文字幕| 亚洲精品久久久久久下一站| 亚洲人成77777在线观看网| 欧美激情国内偷拍| 91久久国产精品| 亚洲免费av片| 国产成人在线一区二区| 午夜精品久久久久久久久久久久| 欧美日韩国产中文精品字幕自在自线| 日韩最新免费不卡| 欧美丝袜一区二区三区| 亚洲韩国欧洲国产日产av| 91美女片黄在线观看游戏| 91精品在线一区| 亚洲图片欧洲图片av| 欧美理论电影在线观看| 亚洲区一区二区| 久久久亚洲天堂| 欧美激情一区二区三区成人| 欧美一区二区.| 国产精品久久久久秋霞鲁丝| 国产精品久久久久久av下载红粉| 亚洲а∨天堂久久精品9966| 欧美精品在线观看91| 欧美成人性色生活仑片| 国产精品久久久久福利| 性欧美在线看片a免费观看| 91久久精品日日躁夜夜躁国产| 国模私拍视频一区| 成人黄色短视频在线观看| 91精品久久久久久久久久久| 久久乐国产精品| 亚洲电影免费观看高清完整版|