<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        node+express實現聊天室

        來源:懂視網 責編:小采 時間:2020-11-27 19:58:32
        文檔

        node+express實現聊天室

        node+express實現聊天室:這次給大家帶來node+express實現聊天室,node+express實現聊天室的注意事項有哪些,下面就是實戰案例,一起來看一下。本篇文章使用node+express+jquery寫一個個性化聊天室,一起來get一下~(源碼地址見文章末尾)效果圖項目結構實現功能登錄檢測系統自動提示
        推薦度:
        導讀node+express實現聊天室:這次給大家帶來node+express實現聊天室,node+express實現聊天室的注意事項有哪些,下面就是實戰案例,一起來看一下。本篇文章使用node+express+jquery寫一個個性化聊天室,一起來get一下~(源碼地址見文章末尾)效果圖項目結構實現功能登錄檢測系統自動提示
        這次給大家帶來node+express實現聊天室,node+express實現聊天室的注意事項有哪些,下面就是實戰案例,一起來看一下。

        本篇文章使用node+express+jquery寫一個個性化聊天室,一起來get一下~(源碼地址見文章末尾)

        效果圖

        項目結構

        實現功能

        1. 登錄檢測

        2. 系統自動提示用戶狀態(進入/離開)

        3. 顯示在線用戶

        4. 支持發送和接收消息

        5. 自定義字體顏色

        6. 支持發送表情

        7. 支持發送圖片

        下面將一一講解如何實現

        前期準備

        node及npm環境、express、socket.io

        具體實現

        1、將聊天室部署到服務器

        先用node搭建一個服務器,部署在localhost:3000端口,先嘗試向瀏覽器發送一個“hello world”,新建server.js文件。

        var app = require('express')(); // 引入express模塊
        var http = require('http').Server(app);
        app.get('/', function(req, res){ // 路由為localhost:3000時向客戶端響應“hello world”
         res.send('<h1>Hello world</h1>'); // 發送數據
        });
        http.listen(3000, function(){ // 監聽3000端口
         console.log('listening on *:3000'); 
        });

        打開瀏覽器輸入網址:localhost:3000是這樣的

        一個node服務器搭建成功。

        接下來用express向瀏覽器返回一個html頁面

        #安裝express模塊
        npm install --save express

        將server.js的代碼改一下:

        var express = require('express');
        var app = express();
        var http = require('http').Server(app); 
        // 路由為/默認www靜態文件夾
        app.use('/', express.static(dirname + '/www'));

        express.static(dirname + '/www');是將www文件夾托管為靜態資源,意味著這個文件夾里的文件(html、css、js)彼此可以用相對路徑。在www文件夾中添加index.html文件以及相應的css(相應css代碼就不貼了,詳情見源碼),如下,該頁面用了font-awesome小圖標

        <!doctype html>
        <html>
         <head> 
         <meta charset="utf-8">
         <meta name="viewport" content="width=device-width, initial-scale=1">
         <title>chat</title>
         <link rel="stylesheet" href="style/index.css" rel="external nofollow" >
         <link rel="stylesheet" href="style/font-awesome-4.7.0/css/font-awesome.min.css" rel="external nofollow" >
         </head>
         <body>
         <p class="all">
         <p class="name">
         <!-- <h2>請輸入你的昵稱</h2> -->
         <input type="text" id="name" placeholder="請輸入昵稱..." autocomplete="off"> 
         <button id="nameBtn">確 定</button>
         </p>
         <p class="main">
         <p class="header">
         <img src="image/logo.jpg">
         happy聊天室
         </p>
         <p id="container">
         <p class="conversation">
         <ul id="messages"></ul>
         <form action="">
         <p class="edit"> 
         <input type="color" id="color" value="#000000">
         <i title="雙擊取消選擇" class="fa fa-smile-o" id="smile">
         </i><i title="雙擊取消選擇" class="fa fa-picture-o" id="img"></i>
         <p class="selectBox"> 
         <p class="smile"> 
         </p>
         <p class="img"> 
         </p>
         </p>
         </p>
         <!-- autocomplete禁用自動完成功能 -->
         <textarea id="m"></textarea>
         <button class="btn rBtn" id="sub">發送</button>
         <button class="btn" id="clear">關閉</button>
         </form>
         </p>
         <p class="contacts">
         <h1>在線人員(<span id="num">0</span>)</h1>
         <ul id="users"></ul>
         <p>當前無人在線喲~</p>
         </p>
         </p>
         </p> 
         </p> 
         </body>
        </html>

        打開localhost:3000,會看到如下:

        聊天室成功部署到服務器。

        2、檢測登錄

        在客戶端和服務器之間傳送消息需要用到socket.io

        #安裝socket.io模塊
        npm install --save socket.io

        將server.js改動如下:

        var app = require('express')();
        var http = require('http').Server(app);
        var io = require('socket.io')(http);
        app.use('/', express.static(dirname + '/www'));
        io.on('connection', function(socket){ // 用戶連接時觸發
         console.log('a user connected');
        });
        http.listen(3000, function(){
         console.log('listening on *:3000');
        });

        當打開localhost:3000的時候會觸發服務器端io的connection事件,會在服務器打印“a user connected”,但是我們想統計一下連接該服務器的用戶人數,如果有用戶連接就打印“n users connected”,n為用戶人數,怎么辦呢?

        在server.js設置一個全局數組為user,每當一個用戶連接成功就在連接事件中將用戶的昵稱push進user,打印user.length即可知道已成功連接用戶的人數。

        等一等。

        在用戶連接的時輸入昵稱登錄,我們應該檢測一下用戶的昵稱是否已存在,避免昵稱相同的情況發生,在服務器監聽一個登錄事件來判斷該情況,由于一切都發生在用戶連接之后,所以觸發事件應該寫在connection事件的回調函數中。

        io.on('connection', (socket)=> {
         // 渲染在線人員
         io.emit('disUser', usersInfo);
         // 登錄,檢測用戶名
         socket.on('login', (user)=> {
         if(users.indexOf(user.name) > -1) { // 昵稱是否存在
         socket.emit('loginError'); // 觸發客戶端的登錄失敗事件
         } else {
         users.push(user.name); //儲存用戶的昵稱
         usersInfo.push(user); // 儲存用戶的昵稱和頭像
         socket.emit('loginSuc'); // 觸發客戶端的登錄成功事件
         socket.nickname = user.name;
         io.emit('system', { // 向所有用戶廣播該用戶進入房間
         name: user.name,
         status: '進入'
         });
         io.emit('disUser', usersInfo); // 渲染右側在線人員信息
         console.log(users.length + ' user connect.'); // 打印連接人數
         }
         });

        system和disUser事件先不管,之后再說 區分io.emit(foo)、socket.emit(foo)、socket.broadcast.emit(foo)

        io.emit(foo); //會觸發所有客戶端用戶的foo事件
        socket.emit(foo); //只觸發當前客戶端用戶的foo事件
        socket.broadcast.emit(foo); //觸發除了當前客戶端用戶的其他用戶的foo事件

        接下來是客戶端代碼chat-client.js

        $(function() {
         // io-client
         // 連接成功會觸發服務器端的connection事件
         var socket = io();
         // 點擊輸入昵稱
         $('#nameBtn').click(()=> { 
         var imgN = Math.floor(Math.random()*4)+1; // 隨機分配頭像
         if($('#name').val().trim()!=='')
         socket.emit('login', { // 觸發服務器端登錄事件
         name: $('#name').val(),
         img: 'image/user' + imgN + '.jpg'
         }); 
         return false; 
         });
         // 登錄成功,隱藏登錄層
         socket.on('loginSuc', ()=> { 
         $('.name').hide(); 
         })
         socket.on('loginError', ()=> {
         alert('用戶名已存在,請重新輸入!');
         $('#name').val('');
         }); 
        });

        倘若登錄成功,會看到如下頁面:

        登錄檢測完成。

        3、系統自動提示用戶狀態(進入/離開)

        該功能是為了實現上圖所示的系統提示“XXX進入聊天室”,在登錄成功時觸發system事件,向所有用戶廣播信息,注意此時用的是io.emit而不是socket.emit,客戶端代碼如下

        // 系統提示消息
        socket.on('system', (user)=> { 
         var data = new Date().toTimeString().substr(0, 8);
         $('#messages').append(`<p class='system'><span>${data}</span><br /><span>${user.name} ${user.status}了聊天室<span></p>`);
         // 滾動條總是在最底部
         $('#messages').scrollTop($('#messages')[0].scrollHeight);
        });

        4、顯示在線用戶

        客戶端監聽一個顯示在線用戶的事件disUser,在以下三個時間段服務器端就觸發一次該事件重新渲染一次

        1. 程序開始啟動時

        2. 每當用戶進入房間

        3. 每當用戶離開房間

        // chat-client.js
        // 顯示在線人員
        socket.on('disUser', (usersInfo)=> {
         displayUser(usersInfo);
        });
        // 顯示在線人員
        function displayUser(users) {
         $('#users').text(''); // 每次都要重新渲染
         if(!users.length) {
         $('.contacts p').show();
         } else {
         $('.contacts p').hide();
         }
         $('#num').text(users.length);
         for(var i = 0; i < users.length; i++) {
         var $html = `<li>
         <img src="${users[i].img}">
         <span>${users[i].name}</span>
         </li>`;
         $('#users').append($html);
         }
        }

        5、支持發送和接收消息

        用戶發送消息時觸發服務器端的sendMsg事件,并將消息內容作為參數,服務器端監聽到sendMsg事件之后向其他所有用戶廣播該消息,用的socket.broadcast.emit(foo)

         // server.js
         // 發送消息事件
         socket.on('sendMsg', (data)=> {
         var img = '';
         for(var i = 0; i < usersInfo.length; i++) {
         if(usersInfo[i].name == socket.nickname) {
         img = usersInfo[i].img;
         }
         }
         socket.broadcast.emit('receiveMsg', { // 向除了發送者之外的其他用戶廣播
         name: socket.nickname,
         img: img,
         msg: data.msg,
         color: data.color,
         side: 'left'
         });
         socket.emit('receiveMsg', { // 向發送者發送消息,為什么分開發送?因為css樣式不同
         name: socket.nickname,
         img: img,
         msg: data.msg,
         color: data.color,
         side: 'right'
         });
         });

        服務器端接受到來自用戶的消息后會觸發客戶端的receiveMsg事件,并將用戶發送的消息作為參數傳遞,該事件會向聊天面板添加聊天內容,以下為chat-client.js代碼

        // 點擊按鈕或回車鍵發送消息
         $('#sub').click(sendMsg);
         $('#m').keyup((ev)=> {
         if(ev.which == 13) {
         sendMsg();
         }
         });
         // 接收消息
         socket.on('receiveMsg', (obj)=> { // 將接收到的消息渲染到面板上
         $('#messages').append(` 
         <li class='${obj.side}'>
         <img src="${obj.img}">
         <p>
         <span>${obj.name}</span>
         <p>${obj.msg}</p>
         </p>
         </li>
         `);
         // 滾動條總是在最底部
         $('#messages').scrollTop($('#messages')[0].scrollHeight);
         });
         // 發送消息
         function sendMsg() { 
         if($('#m').val() == '') { // 輸入消息為空
         alert('請輸入內容!');
         return false;
         }
         socket.emit('sendMsg', {
         msg: $('#m').val()
         });
         $('#m').val(''); 
         return false; 
         }

        6、自定義字體顏色

        得益于html5的input新特性,可以通過type為color的input調用系統調色板

        <!-- $('#color').val();為選中顏色,格式為#FFCCBB -->
        <input type='color' id='color'>

        客戶端根據用戶選擇的顏色渲染內容樣式,代碼很容易看懂,這里就不贅述了。

        7、支持發送表情

        發送表情其實很簡單,將表情圖片放在li中,當用戶點擊li時就將表情的src中的序號解析出來,用[emoji+表情序號]的格式存放在聊天框里,點擊發送后再解析為src。就是一個解析加還原的過程,這一過程中我們的服務器代碼不變,需要改變的是客戶端監聽的receiveMsg事件。

        // chat-client.js
         // 顯示表情選擇面板
         $('#smile').click(()=> {
         $('.selectBox').css('display', "block");
         });
         $('#smile').dblclick((ev)=> { 
         $('.selectBox').css('display', "none");
         }); 
         $('#m').click(()=> {
         $('.selectBox').css('display', "none");
         });
         // 用戶點擊發送表情
         $('.emoji li img').click((ev)=> {
         ev = ev || window.event;
         var src = ev.target.src;
         var emoji = src.replace(/\D*/g, '').substr(6, 8); // 提取序號
         var old = $('#m').val(); // 用戶輸入的其他內容
         $('#m').val(old+'[emoji'+emoji+']');
         $('.selectBox').css('display', "none");
         });

        客戶端收到之后將表情序號還原為src,更改如下

        // chat-client.js
         // 接收消息
         socket.on('receiveMsg', (obj)=> { 
         // 提取文字中的表情加以渲染
         var msg = obj.msg;
         var content = '';
         while(msg.indexOf('[') > -1) { // 其實更建議用正則將[]中的內容提取出來
         var start = msg.indexOf('[');
         var end = msg.indexOf(']');
         content += '<span>'+msg.substr(0, start)+'</span>';
         content += '<img src="image/emoji/emoji%20('+msg.substr(start+6, end-start-6)+').png">';
         msg = msg.substr(end+1, msg.length);
         }
         content += '<span>'+msg+'</span>';
         
         $('#messages').append(`
         <li class='${obj.side}'>
         <img src="${obj.img}">
         <p>
         <span>${obj.name}</span>
         <p style="color: ${obj.color};">${content}</p>
         </p>
         </li>
         `);
         // 滾動條總是在最底部
         $('#messages').scrollTop($('#messages')[0].scrollHeight);
         });

        可以成功發送表情了。

        8、支持發送圖片

        首先是圖片按鈕樣式,發送圖片的按鈕是type為file的input。這里有一個改變樣式的小技巧,那就是將input的透明度設為0,z-index為5,將你想要得樣式放在p中,z-index設為1覆蓋在input上。

        <input type="file" id="file">
        <i class="fa fa-picture-o" id="img"></i>
        css:
        .edit #file {
         width: 32.36px;
         height: 29px;
         opacity: 0;
         z-index: 5;
        }
        .edit #img {
         z-index: 0;
         margin-left: -43px;
        }

        完美

        接下來是點擊按鈕發送圖片,我們用了fileReader對象,這里有一篇不錯的文章講解了fileReader,fileReader是一個對象,可以將我們選中的文件已64位輸出然后將結果存放在reader.result中,我們選中圖片之后,reader.result就存放的是圖片的src

        // chat-client.js
         // 用戶發送圖片
         $('#file').change(function() {
         var file = this.files[0]; // 上傳單張圖片
         var reader = new FileReader();
         //文件讀取出錯的時候觸發
         reader.onerror = function(){
         console.log('讀取文件失敗,請重試!'); 
         };
         // 讀取成功后
         reader.onload = function() {
         var src = reader.result; // 讀取結果
         var img = '<img class="sendImg" src="'+src+'">';
         socket.emit('sendMsg', { // 發送
         msg: img,
         color: color,
         type: 'img' // 發送類型為img
         }); 
         };
         reader.readAsDataURL(file); // 讀取為64位
         });

        由于發送的是圖片,所以對頁面布局難免有影響,為了頁面美觀客戶端在接收其他用戶發送的消息的時候會先判斷發送的是文本還是圖片,根據不同的結果展示不同布局。判斷的方法是在客戶發送消息的時候傳入一個type,根據type的值來確實發送內容的類型。所以上面發送圖片代碼中觸發了sendMsg事件,傳入參數多了一個type屬性。

        響應的,我們應該在chat-client.js中修改receiveMsg事件監聽函數,改為根據傳入type做不同操作

        chat-client.js
         // 接收消息
         socket.on('receiveMsg', (obj)=> { 
         // 發送為圖片
         if(obj.type == 'img') {
         $('#messages').append(`
         <li class='${obj.side}'>
         <img src="${obj.img}">
         <p>
         <span>${obj.name}</span>
         <p style="padding: 0;">${obj.msg}</p>
         </p>
         </li>
         `); 
         $('#messages').scrollTop($('#messages')[0].scrollHeight);
         return;
         }
         // 提取文字中的表情加以渲染
         // 下面不變
         });

        現在我們可以發送圖片了

        相信看了本文案例你已經掌握了方法,更多精彩請關注Gxl網其它相關文章!

        推薦閱讀:

        datepicker怎么使用

        mixin的高階組件使用詳解

        JS獲取圖片的top N色值方法

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        node+express實現聊天室

        node+express實現聊天室:這次給大家帶來node+express實現聊天室,node+express實現聊天室的注意事項有哪些,下面就是實戰案例,一起來看一下。本篇文章使用node+express+jquery寫一個個性化聊天室,一起來get一下~(源碼地址見文章末尾)效果圖項目結構實現功能登錄檢測系統自動提示
        推薦度:
        標簽: 聊天室 js express
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲一级免费毛片| 国产精品亚洲高清一区二区| 3d动漫精品啪啪一区二区免费| 免费国产成人午夜在线观看| 在线观看午夜亚洲一区| 日韩色视频一区二区三区亚洲 | 国产精品美女久久久免费| 亚洲第一页日韩专区| 一区二区三区视频免费| 亚洲精品高清一二区久久| 曰韩无码AV片免费播放不卡| 国产亚洲精品不卡在线| 国产麻豆一精品一AV一免费| 婷婷精品国产亚洲AV麻豆不片| 国产99视频精品免费专区| 亚洲成aⅴ人片在线观| 成全视频在线观看免费高清动漫视频下载| 亚洲日本中文字幕天天更新| 国产成人涩涩涩视频在线观看免费| 日韩亚洲翔田千里在线| 久久九九亚洲精品| 91精品国产免费网站| 亚洲乱码一区二区三区国产精品| 免费无码不卡视频在线观看| 九九综合VA免费看| 亚洲精品综合一二三区在线 | 亚洲阿v天堂在线2017免费| 国产成人免费AV在线播放| 亚洲中文字幕久久精品无码2021| 免费观看的a级毛片的网站| caoporn成人免费公开| 亚洲精品美女视频| 四虎永久免费网站免费观看| 国产婷婷成人久久Av免费高清| 亚洲ts人妖网站| 久久精品亚洲乱码伦伦中文| 1000部拍拍拍18勿入免费视频软件 | 伊人久久亚洲综合影院| 91精品全国免费观看含羞草| 亚洲人成色77777在线观看| 亚洲精品tv久久久久久久久|