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

nodejs實(shí)現(xiàn)的一個(gè)簡單聊天室功能分享

 更新時(shí)間:2014年12月06日 11:46:19   投稿:junjie  
這篇文章主要介紹了nodejs實(shí)現(xiàn)的一個(gè)簡單聊天室功能分享,本文使用了express和socket.io兩個(gè)庫結(jié)合實(shí)現(xiàn),需要的朋友可以參考下

今天我來實(shí)現(xiàn)一個(gè)簡單的聊天室,后臺(tái)用nodejs, 客戶端與服務(wù)端通信用socket.io,這是一個(gè)比較成熟的websocket框架.

初始工作

1.安裝express, 用這個(gè)來托管socket.io,以及靜態(tài)頁面,命令npm install express --save,--save可以使包添加到package.json文件里.
2.安裝socket.io,命令npm install socket.io --save.

編寫服務(wù)端代碼

首先我們通過express來托管網(wǎng)站,并附加到socket.io實(shí)例里,因?yàn)閟ocket.io初次連接需要http協(xié)議

復(fù)制代碼 代碼如下:

var express = require('express'),
    io = require('socket.io');

var app = express();

app.use(express.static(__dirname));

var server = app.listen(8888);


var ws = io.listen(server);


添加服務(wù)器連接事件,當(dāng)客戶端連接成功之后,發(fā)公告告訴所有在線用戶,并且,當(dāng)用戶發(fā)送消息時(shí),發(fā)廣播通知其它用戶.
復(fù)制代碼 代碼如下:

ws.on('connection', function(client){
    console.log('\033[96msomeone is connect\033[39m \n');
    client.on('join', function(msg){
        // 檢查是否有重復(fù)
        if(checkNickname(msg)){
            client.emit('nickname', '昵稱有重復(fù)!');
        }else{
            client.nickname = msg;
            ws.sockets.emit('announcement', '系統(tǒng)', msg + ' 加入了聊天室!');
        }
    });
    // 監(jiān)聽發(fā)送消息
    client.on('send.message', function(msg){
        client.broadcast.emit('send.message',client.nickname,  msg);
    });
    // 斷開連接時(shí),通知其它用戶
    client.on('disconnect', function(){
        if(client.nickname){
            client.broadcast.emit('send.message','系統(tǒng)',  client.nickname + '離開聊天室!');
        }
    })

})

由于客戶端是通過昵稱來標(biāo)識(shí)的,所以服務(wù)端需要一個(gè)檢測昵稱重復(fù)的函數(shù)

復(fù)制代碼 代碼如下:

// 檢查昵稱是否重復(fù)
var checkNickname = function(name){
    for(var k in ws.sockets.sockets){
        if(ws.sockets.sockets.hasOwnProperty(k)){
            if(ws.sockets.sockets[k] && ws.sockets.sockets[k].nickname == name){
                return true;
            }
        }
    }
    return false;
}

編寫客服端代碼

由于服務(wù)端采用第三方websokcet框架,所以前端頁面需要單獨(dú)引用socket.io客戶端代碼,源文件可以從socket.io模塊里找,windows下路徑為node_modules\socket.io\node_modules\socket.io-client\dist,這里有開發(fā)版和壓縮版的,默認(rèn)引用開發(fā)版就行.

前端主要處理輸入昵稱檢查,消息處理,完整代碼如下:

復(fù)制代碼 代碼如下:

<!DOCTYPE html>
<html>
<head>
    <title>socket.io 聊天室例子</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="css/reset.css"/>
    <link rel="stylesheet" href="css/bootstrap.css"/>
    <link rel="stylesheet" href="css/app.css"/>
</head>
<body>
    <div class="wrapper">
         <div class="content" id="chat">
             <ul id="chat_conatiner">
             </ul>
         </div>
         <div class="action">
             <textarea ></textarea>
             <button class="btn btn-success" id="clear">清屏</button>
             <button class="btn btn-success" id="send">發(fā)送</button>
         </div>
    </div>
    <script type="text/javascript" src="js/socket.io.js"></script>
    <script type="text/javascript">

          var ws = io.connect('http://172.16.2.184:8888');
          var sendMsg = function(msg){
              ws.emit('send.message', msg);
          }
          var addMessage = function(from, msg){
              var li = document.createElement('li');
              li.innerHTML = '<span>' + from + '</span>' + ' : ' + msg;
              document.querySelector('#chat_conatiner').appendChild(li);

              // 設(shè)置內(nèi)容區(qū)的滾動(dòng)條到底部
              document.querySelector('#chat').scrollTop = document.querySelector('#chat').scrollHeight;

              // 并設(shè)置焦點(diǎn)
              document.querySelector('textarea').focus();

          }

          var send = function(){
              var ele_msg = document.querySelector('textarea');
              var msg = ele_msg.value.replace('\r\n', '').trim();
              console.log(msg);
              if(!msg) return;
              sendMsg(msg);
              // 添加消息到自己的內(nèi)容區(qū)
              addMessage('你', msg);
              ele_msg.value = '';
          }

          ws.on('connect', function(){
              var nickname = window.prompt('輸入你的昵稱!');
              while(!nickname){
                  nickname = window.prompt('昵稱不能為空,請重新輸入!')
              }
              ws.emit('join', nickname);
          });

          // 昵稱有重復(fù)
          ws.on('nickname', function(){
              var nickname = window.prompt('昵稱有重復(fù),請重新輸入!');
              while(!nickname){
                  nickname = window.prompt('昵稱不能為空,請重新輸入!')
              }
              ws.emit('join', nickname);
          });

          ws.on('send.message', function(from, msg){
              addMessage(from, msg);
          });

          ws.on('announcement', function(from, msg){
              addMessage(from, msg);
          });

          document.querySelector('textarea').addEventListener('keypress', function(event){
              if(event.which == 13){
                  send();
              }
          });
          document.querySelector('textarea').addEventListener('keydown', function(event){
              if(event.which == 13){
                  send();
              }
          });
          document.querySelector('#send').addEventListener('click', function(){
              send();
          });

          document.querySelector('#clear').addEventListener('click', function(){
              document.querySelector('#chat_conatiner').innerHTML = '';
          });
    </script>
</body>
</html>

這里提供完整的代碼壓縮文件

總結(jié)

nodejs是一個(gè)好東西,尤其是在處理消息通訊,網(wǎng)絡(luò)編程方面,天生的異步IO.

相關(guān)文章

  • node讀寫Excel操作實(shí)例分析

    node讀寫Excel操作實(shí)例分析

    這篇文章主要介紹了node讀寫Excel操作,結(jié)合實(shí)例形式分析了node.js使用node-xlsx模塊模塊讀寫Excel的相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • Nodejs中獲取當(dāng)前函數(shù)被調(diào)用的行數(shù)及文件名詳解

    Nodejs中獲取當(dāng)前函數(shù)被調(diào)用的行數(shù)及文件名詳解

    這篇文章主要給大家介紹了關(guān)于Nodejs中獲取當(dāng)前函數(shù)被調(diào)用的行數(shù)及文件名的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • NodeJS學(xué)習(xí)筆記之網(wǎng)絡(luò)編程

    NodeJS學(xué)習(xí)筆記之網(wǎng)絡(luò)編程

    Node.js采用了Google Chrome瀏覽器的V8引擎,性能很好,同時(shí)還提供了很多系統(tǒng)級(jí)的API,如文件操作、網(wǎng)絡(luò)編程等。Node.js則是一個(gè)全面的后臺(tái)運(yùn)行時(shí),為Javascript提供了其他語言能夠?qū)崿F(xiàn)的許多功能。今天我們來看下Nodejs的網(wǎng)絡(luò)編程
    2014-08-08
  • Nodejs中的JWT和Session的使用

    Nodejs中的JWT和Session的使用

    這篇文章主要介紹了Nodejs中的JWT和Session的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • node.js中的fs.appendFile方法使用說明

    node.js中的fs.appendFile方法使用說明

    這篇文章主要介紹了node.js中的fs.appendFile方法使用說明,本文介紹了fs.appendFile方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Electron 調(diào)用命令行(cmd)

    Electron 調(diào)用命令行(cmd)

    這篇文章主要介紹了Electron 調(diào)用命令行(cmd),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Node.js對MongoDB進(jìn)行增刪改查操作的實(shí)例代碼

    Node.js對MongoDB進(jìn)行增刪改查操作的實(shí)例代碼

    這篇文章主要介紹了Node.js對MongoDB進(jìn)行增刪改查操作 ,需要的朋友可以參考下
    2019-04-04
  • pm2 部署 node的三種方法示例

    pm2 部署 node的三種方法示例

    本篇文章主要介紹了pm2 部署 node的三種方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • Node.js入門教程:在windows和Linux上安裝配置Node.js圖文教程

    Node.js入門教程:在windows和Linux上安裝配置Node.js圖文教程

    這篇文章主要介紹了Node.js入門教程:在windows和Linux上安裝配置Node.js的方法,本文圖文并茂,步驟明細(xì),是學(xué)習(xí)安裝node.js的絕佳教程,需要的朋友可以參考下
    2014-08-08
  • node.js中 redis 的安裝和基本操作示例

    node.js中 redis 的安裝和基本操作示例

    這篇文章主要介紹了node.js中 redis 的安裝和基本操作,結(jié)合實(shí)例形式分析了node.js中Redis下載、安裝、數(shù)據(jù)類型及基本操作技巧,需要的朋友可以參考下
    2020-02-02

最新評(píng)論