最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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('昵稱不能為空,請(qǐng)重新輸入!')
              }
              ws.emit('join', nickname);
          });

          // 昵稱有重復(fù)
          ws.on('nickname', function(){
              var nickname = window.prompt('昵稱有重復(fù),請(qǐng)重新輸入!');
              while(!nickname){
                  nickname = window.prompt('昵稱不能為空,請(qǐng)重新輸入!')
              }
              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.JS利用PhantomJs抓取網(wǎng)頁入門教程

    Node.JS利用PhantomJs抓取網(wǎng)頁入門教程

    現(xiàn)今,網(wǎng)頁抓取已經(jīng)是一種人所共知的技術(shù)了,然而依然存在著諸多復(fù)雜性,下面這篇文章主要給大家介紹了Node.JS利用PhantomJs抓取網(wǎng)頁的方法教程,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • 在NodeJS中啟用ECMAScript 6小結(jié)(windos以及Linux)

    在NodeJS中啟用ECMAScript 6小結(jié)(windos以及Linux)

    ECMAScript 6 是JavaScript的下一代標(biāo)準(zhǔn),其目標(biāo),是使得JavaScript可以用來編寫復(fù)雜的應(yīng)用程序、函數(shù)庫和代碼的自動(dòng)生成器(code generator)。
    2014-07-07
  • node 命令方式啟動(dòng)修改端口的方法

    node 命令方式啟動(dòng)修改端口的方法

    今天小編就為大家分享一篇node 命令方式啟動(dòng)修改端口的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Node中文件斷點(diǎn)續(xù)傳原理和方法總結(jié)

    Node中文件斷點(diǎn)續(xù)傳原理和方法總結(jié)

    在之前做過一個(gè)小項(xiàng)目,涉及到了文件上傳,在大文件上面使用了斷點(diǎn)續(xù)傳,降低了服務(wù)器方面的壓力,現(xiàn)在小編把Node中文件斷點(diǎn)續(xù)傳原理和方法總結(jié)分享給大家,感興趣的朋友一起看看吧
    2022-01-01
  • 詳解使用Nodejs內(nèi)置加密模塊實(shí)現(xiàn)對(duì)等加密與解密

    詳解使用Nodejs內(nèi)置加密模塊實(shí)現(xiàn)對(duì)等加密與解密

    這篇文章主要介紹了使用Nodejs內(nèi)置加密模塊實(shí)現(xiàn)對(duì)等加密與解密,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 利用node.js本地搭建HTTP服務(wù)器

    利用node.js本地搭建HTTP服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了利用node.js本地搭建HTTP服務(wù)器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • ChatGPT編程秀之最小元素的設(shè)計(jì)示例詳解

    ChatGPT編程秀之最小元素的設(shè)計(jì)示例詳解

    這篇文章主要為大家介紹了ChatGPT編程秀之最小元素的設(shè)計(jì)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • node.js 發(fā)布訂閱模式的實(shí)例

    node.js 發(fā)布訂閱模式的實(shí)例

    下面小編就為大家?guī)硪黄猲ode.js 發(fā)布訂閱模式的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就想給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • 利用express啟動(dòng)一個(gè)server服務(wù)的方法

    利用express啟動(dòng)一個(gè)server服務(wù)的方法

    下面小編就為大家?guī)硪黄胑xpress啟動(dòng)一個(gè)server服務(wù)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • 關(guān)于NodeJs和JAVA建立socket連接方式

    關(guān)于NodeJs和JAVA建立socket連接方式

    這篇文章主要介紹了關(guān)于NodeJs和JAVA建立socket連接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

桂东县| 会昌县| 永顺县| 乌审旗| 弥勒县| 江孜县| 九龙坡区| 綦江县| 怀远县| 巴彦县| 彩票| 万源市| 突泉县| 台南县| 长宁县| 彩票| 东阿县| 静宁县| 西宁市| 平阳县| 嘉鱼县| 沙湾县| 项城市| 玉溪市| 永新县| 出国| 南宁市| 济源市| 铁岭市| 宜宾县| 高淳县| 伊宁县| 昆山市| 湖北省| 宽甸| 谷城县| 景德镇市| 东宁县| 丰顺县| 宁晋县| 诸城市|