Websocket直播间聊天室教程  GoEasy快速实现聊天室

最近两年直播那个火啊,真的是无法形容!经常有朋友问起,我想实现一个直播间聊天或者我想开发一个聊天室, 要如何开始呢?

今天小编就手把手的教你用GoEasy做一个聊天室,当然也可以用于直播间内的互动。全套源码已经开源,git地址: https://gitee.com/goeasy-io/GoEasyDemo-Live-Chatroom.git

本教程主要目的是为大家介绍实现思路,为了确保本教程能帮助到使用不同前端技术的朋友,采用了HTML + JQuery的方式,后续还会推出Uniapp(vue/nvue)和小程序版本,大家可以持续关注。

我们这次要实现的聊天室,有两个界面,分别是:

  • 登录界面
  • 聊天室界面

登录

对于登录界面,我们期望:

  • 用户可以输入自己的昵称
  • 用户可以选择自己喜欢的头像
  • 用户可以选择进入不同的聊天室(直播间)

实现步骤

登录界面的实现,不用多说,因为真的是So Easy! 一个简单的界面,只包含三个简单的逻辑:

验证是否输入昵称

验证是否选择一个头像

根据选择进入相应的聊天室

下边重点讲一下聊天室的实现。

聊天室(直播间)

当我们进入一个聊天室后,我们期望:

  • 用户能看到当前有多少用户在线,这个数字能够实时的更新
  • 用户能看到当前在线用户们的头像,而且能够实时的更新
  • 如果有用户进入或离开聊天室
  • 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聊天室内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang基于websocket实现的简易聊天室程序

    本文实例讲述了golang基于websocket实现的简易聊天室.分享给大家供大家参考,具体如下: 先说点无关的,最近忙于工作没有更新博客,今天休息顺便把golang websocket研究了一下,挺好玩的,写了一个聊天室,分享给大家. websocket包 : code.google.com/p/go.net/websocket 文档 : http://go.pkgdoc.org/code.google.com/p/go.net/websocket 首先安装websocket包 复制代码 代码

  • .NET Core 基于Websocket的在线聊天室实现

    什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后就会断开连接. 在没有websocket之前web系统如果要做双工通讯往往使用http long polling技术.http long polling 每次往服务器发送请求后,服务端不会立刻返回信息来结束请求,而是一直挂着直到有数据需要返回,或者等待超时了才会返回.客户端在结束上一次请求后立刻再发

  • 用java WebSocket做一个聊天室

    最近一个项目中,需要用到Java的websocket新特性,于是就学了一下,感觉这技术还挺好玩的,瞬间知道网页上面的那些在线客服是怎么做的了. 先看图: 实现了多客户机进行实时通讯. 下面看代码项目结构图:很简单,就1个类,1个页面 然后看具体代码 先看后端代码 package com.main; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.

  • 基于Swoole实现PHP与websocket聊天室

    websocket Websocket只是一个网络通信协议 就像 http.ftp等都是网络通信的协议:不要多想: 相对于HTTP这种非持久的协议来说,Websocket是一个持久化网络通信的协议: WebSocket和HTTP的关系 有交集,但是并不是全部. Websocket只是借用了HTTP的一部分协议来完成一次握手.(HTTP的三次握手,此处只完成一次) http和websocket 请求头对比: HTTP: 原来的时候,客户端通过http(骑马)带着信请求服务器,服务器处理请求(写回信

  • 使用Java和WebSocket实现网页聊天室实例代码

    在没介绍正文之前,先给大家介绍下websocket的背景和原理: 背景 在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更

  • express框架实现基于Websocket建立的简易聊天室

    最近想写点有意思的,所以整了个这个简单的不太美观的小玩意 首先你得确认你的电脑装了node,然后就可以按照步骤 搞事情了~~ 1.建立一个文件夹 2.清空当前文件夹地址栏,在文件夹地址栏中输入cmd.exe 3.我们需要下载点小东西 ,需要在命令行输入 npm install express 回车 等待一会 npm install express-session 回车 等待一会 npm install ejs 回车 等待一会 npm install socket.io 回车 等待一会 叮~~~

  • Websocket直播间聊天室教程  GoEasy快速实现聊天室

    最近两年直播那个火啊,真的是无法形容!经常有朋友问起,我想实现一个直播间聊天或者我想开发一个聊天室, 要如何开始呢? 今天小编就手把手的教你用GoEasy做一个聊天室,当然也可以用于直播间内的互动.全套源码已经开源,git地址: https://gitee.com/goeasy-io/GoEasyDemo-Live-Chatroom.git 本教程主要目的是为大家介绍实现思路,为了确保本教程能帮助到使用不同前端技术的朋友,采用了HTML + JQuery的方式,后续还会推出Uniapp(vue/

  • Websocket IM聊天教程 教你用GoEasy快速实现IM聊天

    经常有朋友问起GoEasy如何实现IM,今天就手把手的带大家从头到尾用GoEasy实现一个完整IM聊天,全套代码已经放在了github. 今日的前端技术发展可谓百花争鸣,为了确保本文能帮助到使用任何技术栈的前端工程师,Demo的源码实现上选择了最简单的HTML+JQuery的方式,所以,不论您是准备用Uniapp开发移动APP,还是准备写个小程序,不论你喜欢用React还是VUE,还是React-native或ionic, 或者您直接用原生 和Type ,都是可以轻松理解,全套代码已经放在git

  • Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例

    本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息.分享给大家供大家参考,具体如下: import time from multiprocessing import Pool from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.web

  • 用Python实现一个模仿UP主弹幕控制的直播间功能

    灵感来源 之前在B站看到一个有意思的视频: [B站][亦]终极云游戏!五千人同开一辆车,复现经典群体智慧实验 大家可以看看,很有意思. up主通过代码实现了实时读取直播间里的弹幕内容,进而控制自己的电脑,把弹幕翻译成指令操控<赛博朋克2077>游戏. 观众也越来越多,最后甚至还把直接间搞崩了(当然,其实是因为那天B站全站崩了). 我十分好奇到底是怎么做到的. 外行看热闹,内行看门道,作为半个内行,我们就模仿UP主的想法,自己做一个. 所以今天我的目标就是复刻一个 通过弹幕控制直播间 的代码,并

  • java socket实现聊天室 java实现多人聊天功能

    用java socket做一个聊天室,实现多人聊天的功能.看了极客学院的视频后跟着敲的.(1DAY) 服务端: 1. 先写服务端的类MyServerSocket,里面放一个监听线程,一启动就好 2. 实现服务端监听类ServerListener.java,用accept来监听,一旦有客户端连上,生成新的socket,就新建个线程实例ChatSocket.启动线程后就把线程交给ChatManager管理 3. 在ChatSocket中实现从客户端读取内容,把读取到的内容发给集合内所有的客户端 4.

  • 易语言解析B站直播间的地址获得弹幕内容的代码

    常量数据表 .版本 2 .常量 常量1, "<文本长度: 31>", , <span class="info-text" title=" .常量 常量2, "<文本长度: 2>", , "> .常量 常量3, "<文本长度: 19>", , http://i0.hdslb.com.常量 常量4, "<文本长度: 4>", , .

  • vue实现直播间点赞飘心效果的示例代码

    前言: 在开发公司项目的时候,遇到了直播间的一些功能,其中点赞冒泡飘心,就折腾了好久,canvas学的不好,自己写不来,百度找了一堆都是js原生写法,迁移到vue项目里来好多问题,百度也解决不了.自己试着慢慢解决,竟然在不知不觉中通了!废话不多说,直接上代码,复制粘贴即可使用 示例: 不动就不动吧.png ```第一步```:先在外部新建一个js文件,取名index.js(名字自己随便取) index.js代码内容如下: /** * LikeHeart * @version: 1.0.0 * @

  • springboot整合websocket最基础入门使用教程详解

    项目最终的文件结构 1 添加maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <

  • Python爬取英雄联盟MSI直播间弹幕并生成词云图

    一.环境准备 安装相关第三方库 pip install jieba pip install wordcloud 二.数据准备 爬取对象:2021年5月23号,RNG夺冠直播间的弹幕信息 爬取对象路径: 方式1.根据开发者工具(F12),获取请求url.请求头.cookie等信息: 方式2:根据直播地址url,前+字符i 我们这里演示的是,采用方式2. 三.代码如下 import requests, re import jieba, wordcloud """ # 以下是练习代

  • MyBatis入门学习教程-MyBatis快速入门

    目录 Mybatis 一.快速开始 1.创建 Maven 项目 2.导入 Maven 依赖 3.配置 Maven 插件 4.新建数据库,导入表格 5.编写 Mybatis 配置文件 6.编写实体类 7.编写 mapper 接口 8.编写 mapper 实现 9.Mybatis 配置文件中,添加 mapper 映射 10.编写 Mybatis 工具类 11.测试 二.日志添加 1.添加 Maven 依赖 2.添加 log4j 配置 3.Mybatis 中配置 LOG 4.执行测试 三.Mybati

随机推荐