欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于node+websocket+html實(shí)現(xiàn)騰訊課堂聊天室聊天功能

 更新時(shí)間:2020年03月04日 16:20:34   作者:瘋!不會(huì)停息-春哥  
這篇文章主要介紹了基于node+websocket+html實(shí)現(xiàn)騰訊課堂聊天室聊天功能,本文通過截圖實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

受疫情影響很多中小學(xué)選擇線上教程,大多數(shù)學(xué)校采用騰訊課堂直播,那么今天小編給大家分享一段代碼關(guān)于基于node+websocket+html實(shí)現(xiàn)騰訊課堂聊天室聊天功能。

前端部分用到的知識(shí):websocket,h5,contenteditable屬性服務(wù)端部分:node, websocket部分效果:

功能細(xì)節(jié)需要注意的地方

前端部分:

(1)輸入框要可以輸入表情圖片( 不能用textarea,要用contenteditable='true'來實(shí)現(xiàn))

(2)消息數(shù)量的顯示限制,比如我最多只顯示最新的30條消息 (通過對(duì)dom節(jié)點(diǎn)的長度判斷和移除實(shí)現(xiàn))

  (3) 最新消息要始終顯示在底部(通過scrollTop來實(shí)現(xiàn))

 (4)對(duì)信息分類進(jìn)行區(qū)分,是用戶進(jìn)入,離開,普通消息,還是送花進(jìn)行劃分

服務(wù)端部分:

websocket相關(guān)知識(shí)的運(yùn)用

代碼:

<!DOCTYPE html>
<html lang="en">
 
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <link rel="stylesheet" type="text/css" href="css/style.css" rel="external nofollow" />
 <title>聊天室</title>
</head>
 
<body>
 <div class="container">
 <header>不充錢你覺得你會(huì)變得更強(qiáng)嗎?。?!</header>
 <div class="cont">
  <video src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4" controls="controls"></video>
 </div>
 <div class="right">
  <div class="right_top">
  <div class="item ac_border">討論</div>
  <div class="item" id="person">成員</div>
  </div>
  <div class="r_item">
  <div class="right_cont">
   <ul id="messageWrap"></ul>
  </div>
  <div class="right_bot">
   <div class="r_b_t clearfix">
   <div class="emoji " title="選擇標(biāo)簽"></div>
   <div class="flower" title="獻(xiàn)花"></div>
   </div>
   <div class="inputMeg_f">
   <!--inputMeg外添加div inputMeg_f 的原因是為了自定義滾動(dòng)條的手勢(shì)是箭頭,如果不加,改成inputMeg設(shè)置滾動(dòng)條樣式,那么滾動(dòng)條的熟悉是輸入手勢(shì)-->
   <div class="inputMeg" contenteditable="true" placeholder="請(qǐng)輸入文字"></div>
   </div>
   <div class="send_btn">發(fā)送</div>
   <div id="emojiBox" class="clearfix"></div>
  </div>
  </div>
  <div class="r_item" style="display: none">
   <ul class="personWrap"></ul>
  </div>
 </div>
 </div>
</body>
 
<script src="../jquery.js"></script>
<script>
 $(".right_top .item").click(function () {
 $(this).siblings().removeClass('ac_border')
 $(this).addClass('ac_border')
 $('.r_item').css('display','none').eq($(this).index()).css('display','block')
 })
 
 function checkValue() {
 
 $(".emoji").off('click').click(function (e) {
  $("#emojiBox").css('display', 'block')
  var ev = e || window.event;
  ev.stopPropagation();
 })
 $(".container").off('click').click(function () {
  $("#emojiBox").css('display', 'none')
 })
 
 
 }
 checkValue();
 
 //生成表情
 var emojiHtml = '';
 var emojiBox = document.getElementById('emojiBox');
 for (var i = 0; i < 7; i++) {
 for (var j = 0; j < 15; j++) {
  var dom = document.createElement('div');
  dom.className = 'emojiItem';
  dom.style.backgroundPositionX = -24 * j + 'px';
  dom.style.backgroundPositionY = -29 * i + 'px';
  emojiBox.appendChild(dom)
  chooseEmoji(i, j, dom)
 }
 
 }
 
 function chooseEmoji(i, j, dom) {
 dom.onclick = function (e) {
  const src = 'img/icon' + (i * 15 + j) + '.gif';
  var img = $('<img class="emojiImg" src=' + src + '>')
  $('.inputMeg').append(img)
  $("#emojiBox").css('display', 'none')
  var ev = e || window.event;
  ev.stopPropagation();
 }
 }
 
 var userName=''; //當(dāng)前登錄的用戶
 //websocket
 var websocket = new WebSocket(
 'ws://localhost:8001/'); //連接的地址,是ws協(xié)議,不是http協(xié)議(本地地址localhost:8001,要想手機(jī)也能訪問到,改成本地ip192.168.0.107:8001)
 websocket.onopen = function () { //監(jiān)聽建立連接
 $('.send_btn').off('click').click(function () {
  var text = $('.inputMeg').html()
  if (text != '' && text != '請(qǐng)輸入文字') {
  websocket.send(JSON.stringify({data:text,type:'message'})) //發(fā)送消息
  $('.inputMeg').html('')
  }
 });
 
 $('.flower').off('click').click(function(){ //送花
  var dom= '<span>"'+userName+'"</span>送給<br> "春哥" 一朵小花<i class="flowIcon"></i>'
  
  websocket.send(JSON.stringify({data:dom,type:'flower'})) //發(fā)送消息
 })
 
 }
 websocket.onmessage = function (e) {
 var res = JSON.parse(e.data);
 message(res)
 }
 
 
 function message(res) {
 var dom = document.createElement('li');
 switch (res.type) {
  case 'enter':
  dom.innerHTML = res.data;
  dom.style.color = 'green';
  userName=res.nickname;
  person(res);
  break;
  case 'leave':
  dom.innerHTML = res.data;
  dom.style.color = 'red';
  person(res)
  break;
  case 'message':
  name.innerHTML = res.nickname + ': ';
  dom.innerHTML = "<span class='nickName'>" + res.nickname + ": </span> " + res.data + ""
  break;
  case 'flower':
  dom.className='flowerLi';
  dom.innerHTML=res.data;
  break;
  default:
  break;
 }
 document.getElementById('messageWrap').appendChild(dom);
 limitLength(30)
 scrollBottom();
 
 //成員顯示
 
 }
 
 function scrollBottom() { //顯示最新消息在底部
 var h1 = document.getElementsByClassName('right_cont')[0].offsetHeight;
 var h2 = document.getElementById('messageWrap').offsetHeight;
 if (h2 > h1) {
  $('.right_cont').scrollTop(h2 - h1);
 }
 }
 
 function limitLength(num) { //限制聊天室最多能顯示幾條消息
 var li = $('#messageWrap li')
 if (li.length > num) {
  li.eq(0).remove();
 }
 }
 
 function person(res){ //成員顯示
 var html=''
 for(var i=0;i<res.client.length;i++){
  html+= '<li><span class="nickname">'+res.client[i]+'</span></li>'
 }
 $('.personWrap').html(html);
 
 $('#person').html('成員('+res.client.length+')')
 
 }
</script>
 
</html>
 
 
server.js:
var ws = require("nodejs-websocket")
var port=8001;
var clientCount=0;
var nicknameArr=[];
var server = ws.createServer(function (conn) {
	clientCount++;
	conn.nickname='user'+clientCount;
	nicknameArr.push(conn.nickname)
	var mes={type:'enter',data:'歡迎 '+conn.nickname+' 進(jìn)入聊天',nickname:conn.nickname,client:nicknameArr}
	broadcast(JSON.stringify(mes))
	conn.on("text", function (str) { //監(jiān)聽客戶端發(fā)送過來的消息
		var zstr=JSON.parse(str)
		var mes={type:zstr.type,data:zstr.data,nickname:conn.nickname,client:nicknameArr}
		broadcast(JSON.stringify(mes))
		
	})
	conn.on("close", function (code, reason) {
		clientCount--;
		for(var i=nicknameArr.length-1;i>=0;i--){ //刪除退出的用戶
			if(conn.nickname==nicknameArr[i]){
				nicknameArr.splice(i,1)
			}
		}
		var mes={type:'leave',data:conn.nickname+' 離開聊天',nickname:conn.nickname,client:nicknameArr}
		broadcast(JSON.stringify(mes))
	});
	conn.on('error',function(err){
		console.log('handle err')
	})
}).listen(port)
function broadcast(str){ //獲取客戶端連接的人數(shù)并返回消息
	server.connections.forEach(function(connection){
		connection.sendText(str)
	})
 
}

總結(jié)

到此這篇關(guān)于基于node+websocket+html實(shí)現(xiàn)騰訊課堂聊天室聊天功能的文章就介紹到這了,更多相關(guān)node+websocket+html聊天室內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解如何查看node端口被占用并殺死

    詳解如何查看node端口被占用并殺死

    這篇文章主要給大家介紹了如何查看node端口被占用并殺死,文中給出了相關(guān)的解決方法,并通過代碼示例給大家介紹的非常詳細(xì),對(duì)前端開發(fā)要學(xué)會(huì)如何查看端口占用并殺死非常有用,需要的朋友可以參考下
    2024-01-01
  • node+express+ejs制作簡單頁面上手指南

    node+express+ejs制作簡單頁面上手指南

    本文記錄了使用node+express+ejs制作簡單頁面的全過程,話說express+ejs真的是太難了,有種蛋蛋的憂傷~
    2014-11-11
  • nodejs爬蟲遇到的亂碼問題匯總

    nodejs爬蟲遇到的亂碼問題匯總

    這篇文章主要給大家匯總介紹了作者再制作nodejs爬蟲遇到的亂碼問題,有相同問題的小伙伴可以參考下
    2017-04-04
  • 初識(shí)Node.js

    初識(shí)Node.js

    本文主要是簡單講訴了Node.js的介紹,安裝,希望對(duì)剛剛接觸Node.js的同學(xué)能有所幫助,有什么問題可以給我留言,一起學(xué)習(xí)進(jìn)步
    2014-09-09
  • npm install安裝模塊-save和-save-dev命令的區(qū)別

    npm install安裝模塊-save和-save-dev命令的區(qū)別

    這篇文章介紹了npm install安裝模塊-save和-save-dev命令的區(qū)別,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • nodejs更改項(xiàng)目端口號(hào)的方法

    nodejs更改項(xiàng)目端口號(hào)的方法

    今天小編就為大家分享一篇nodejs更改項(xiàng)目端口號(hào)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 10個(gè)Node.js庫幫助你優(yōu)化代碼和簡化開發(fā)

    10個(gè)Node.js庫幫助你優(yōu)化代碼和簡化開發(fā)

    這篇文章主要介紹了10個(gè)Node.js庫幫助你優(yōu)化代碼和簡化開發(fā),其中包括處理數(shù)組、對(duì)象、字符串庫Lodash,緩存數(shù)據(jù)處理庫Node-cache,解析、操作和格式化日期和時(shí)間庫Moment.js,Redis操作庫,發(fā)送電子郵件庫Nodemailer
    2023-05-05
  • Node.js基礎(chǔ)入門之回調(diào)函數(shù)及異步與同步詳解

    Node.js基礎(chǔ)入門之回調(diào)函數(shù)及異步與同步詳解

    Node.js是一個(gè)基于Chrome?V8引擎的JavaScript運(yùn)行時(shí)。類似于Java中的JRE,.Net中的CLR。本文將詳細(xì)為大家介紹Node.js中的回調(diào)函數(shù)及異步與同步,感興趣的可以了解一下
    2022-03-03
  • Windows下安裝 node 的版本控制工具 nvm

    Windows下安裝 node 的版本控制工具 nvm

    這篇文章主要介紹了Windows下安裝 node 的版本控制工具 nvm的相關(guān)資料,需要的朋友可以參考下
    2020-02-02
  • Express下采用bcryptjs進(jìn)行密碼加密的方法

    Express下采用bcryptjs進(jìn)行密碼加密的方法

    本篇文章主要介紹了Express下采用bcryptjs進(jìn)行密碼加密的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02

最新評(píng)論