真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

基于Nodejs利用socket.io實現(xiàn)多人聊天室

socket.io簡介

創(chuàng)新互聯(lián)是一家成都網(wǎng)站設(shè)計、網(wǎng)站制作,提供網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,網(wǎng)站制作,建網(wǎng)站,定制設(shè)計,網(wǎng)站開發(fā)公司,自2013年創(chuàng)立以來是互聯(lián)行業(yè)建設(shè)者,服務(wù)者。以提升客戶品牌價值為核心業(yè)務(wù),全程參與項目的網(wǎng)站策劃設(shè)計制作,前端開發(fā),后臺程序制作以及后期項目運營并提出專業(yè)建議和思路。

在Html5中存在著這樣的一個新特性,引入了websocket,關(guān)于websocket的內(nèi)部實現(xiàn)原理可以看這篇文章,這篇文章講述了websocket無到有,根據(jù)協(xié)議,分析數(shù)據(jù)幀的頭,進行構(gòu)建websocket。雖然代碼短,但可以很好地體現(xiàn)websocket的原理。

,這個特性提供了瀏覽器端和服務(wù)器端的基于TCP連接的雙向通道。但是并不是所有的瀏覽器都支持websocket特性,故為了磨平瀏覽器間的差異,為開發(fā)者提供統(tǒng)一的接口,引入了socket.io模塊。在不支持websoket的瀏覽器中,socket.io可以降級為其他的通信方式,比如有AJAX long polling ,JSONP Polling等。
模塊安裝

新建一個package.json文件,在文件中寫入如下內(nèi)容:

{
 "name": "socketiochatroom",
 "version": "0.0.1",
 "dependencies": {
 "socket.io": "*",
 "express":"*"
 }
}

npm install

執(zhí)行完這句,node將會從npm處下載socket.io和express模塊。

-

服務(wù)器端的實現(xiàn)

在文件夾中添加index.js文件,并在文件中寫入如下內(nèi)容:

/**
 * Created by bamboo on 2016/3/31.
 */
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function (req, res) {
 "use strict";
 res.end("

socket server

") }); /*在線人員*/ var onLineUsers = {}; /* 在線人數(shù)*/ var onLineCounts = 0; /*io監(jiān)聽到存在鏈接,此時回調(diào)一個socket進行socket監(jiān)聽*/ io.on('connection', function (socket) { console.log('a user connected'); /*監(jiān)聽新用戶加入*/ socket.on('login', function (user) { "use strict"; //暫存socket.name 為user.userId;在用戶退出時候?qū)玫? socket.name = user.userId; /*不存在則加入 */ if (!onLineUsers.hasOwnProperty(user.userId)) { //不存在則加入 onLineUsers[user.userId] = user.userName; onLineCounts++; } /*一個用戶新加入,向所有客戶端監(jiān)聽login的socket的實例發(fā)送響應(yīng),響應(yīng)內(nèi)容為一個對象*/ io.emit('login', {onLineUsers: onLineUsers, onLineCounts: onLineCounts, user: user}); console.log(user.userName, "加入了聊天室");//在服務(wù)器控制臺中打印么么么用戶加入到了聊天室 }); /*監(jiān)聽用戶退出聊天室*/ socket.on('disconnect', function () { "use strict"; if (onLineUsers.hasOwnProperty(socket.name)) { var user = {userId: socket.name, userName: onLineUsers[socket.name]}; delete onLineUsers[socket.name]; onLineCounts--; /*向所有客戶端廣播該用戶退出群聊*/ io.emit('logout', {onLineUsers: onLineUsers, onLineCounts: onLineCounts, user: user}); console.log(user.userName, "退出群聊"); } }) /*監(jiān)聽到用戶發(fā)送了消息,就使用io廣播信息,信息被所有客戶端接收并顯示。注意,如果客戶端自己發(fā)送的也會接收到這個消息,故在客戶端應(yīng)當(dāng)存在這的判斷,是否收到的消息是自己發(fā)送的,故在emit時,應(yīng)該將用戶的id和信息封裝成一個對象進行廣播*/ socket.on('message', function (obj) { "use strict"; /*監(jiān)聽到有用戶發(fā)消息,將該消息廣播給所有客戶端*/ io.emit('message', obj); console.log(obj.userName, "說了:", obj.content); }); }); /*監(jiān)聽3000*/ http.listen(3000, function () { "use strict"; console.log('listening 3000'); });

運行服務(wù)器端程序

node index.js

輸出

listening 3000

此時在瀏覽器中打開localhost:3000會得到這樣的結(jié)果:

基于Nodejs利用socket.io實現(xiàn)多人聊天室

原因是在代碼中只對路由進行了如下設(shè)置

app.get('/', function (req, res) {
 "use strict";
 res.end("

socket server

") });

服務(wù)器端主要是提供socketio服務(wù),并沒有設(shè)置路由。

客戶端的實現(xiàn)

在客戶端建立如下的目錄和文件,其中json3.min.js可以從網(wǎng)上下載到。

client

- - - client.js
- - - index.html
- - - json3.min.js
- - - style.css

在index.html中




 
 
 
 1301群聊
 
 
 


輸入你在群聊中的昵稱

1301群聊 | 退出

在client.js中

/**
 * Created by bamboo on 2016/3/31.
 */
 /*即時運行函數(shù)*/
(function () {
 "use strict";
 var d = document,
  w = window,
  dd = d.documentElement,
  db = d.body,
  dc = d.compatMode === "CSS1Compat",
  dx = dc ? dd : db,
  ec = encodeURIComponent,
  p = parseInt;
 w.CHAT = {
  msgObj: d.getElementById("message"),
  screenHeight: w.innerHeight ? w.innerHeight : dx.innerHeight,
  userName: null,
  userId: null,
  socket: null,
  /*滾動條始終在最底部*/
  scrollToBottom: function () {
   w.scrollTo(0, this.msgObj.clientHeight);
  },
  /*此處僅為簡單的刷新頁面,當(dāng)然可以做復(fù)雜點*/
  logout: function () {
   // this.socket.disconnect();
   w.top.location.reload();
  },
  submit: function () {
   var content = d.getElementById('content').value;
   if (content != '') {
    var obj = {
     userId: this.userId,
     userName: this.userName,
     content: content
    };
    //如在服務(wù)器端代碼所說,此對象就行想要發(fā)送的信息和發(fā)送人組合成為對象一起發(fā)送。
    this.socket.emit('message', obj);
    d.getElementById('content').value = '';
   }
   return false;
  },
  /**客戶端根據(jù)時間和隨機數(shù)生成ID,聊天用戶名稱可以重復(fù)*/
  genUid: function () {
   return new Date().getTime() + "" + Math.floor(Math.random() * 889 + 100);
  },
  /*更新系統(tǒng)信息
  主要是在客戶端顯示當(dāng)前在線人數(shù),在線人列表等,當(dāng)有新用戶加入或者舊用戶退出群聊的時候做出頁面提示。*/
  updateSysMsg: function (o, action) {
   var onLineUsers = o.onLineUsers;
   var onLineCounts = o.onLineCounts;
   var user = o.user;
   //更新在線人數(shù)
   var userHtml = '';
   var separator = '';
   for (var key in onLineUsers) {
    if (onLineUsers.hasOwnProperty(key)) {
     userHtml += separator + onLineUsers[key];
     separator = '、';
    }
   }
   //插入在線人數(shù)和在線列表
   d.getElementById('onLineCounts').innerHTML = '當(dāng)前共有' + onLineCounts + "在線列表: " + userHtml;
   //添加系統(tǒng)消息
   var html = '';
   html += '
'; html += user.userName; html += (action === "login") ? "加入了群聊" : "退出了群聊"; html += '
'; var section = d.createElement('section'); section.className = 'system J-mjrlinkWrap J-cutMsg'; section.innerHTML = html; this.msgObj.appendChild(section); this.scrollToBottom(); }, /*用戶提交用戶名后,將loginbox設(shè)置為不顯示,將chatbox設(shè)置為顯示*/ userNameSubmit: function () { var userName = d.getElementById('userName').value; if (userName != '') { d.getElementById('userName').value = ''; d.getElementById('loginbox').style.display = 'none'; d.getElementById('chatbox').style.display = 'block'; this.init(userName);//調(diào)用init方法 } return false; }, //用戶初始化 init: function (userName) { //隨機數(shù)生成uid this.userId = this.genUid(); this.userName = userName; d.getElementById('showUserName').innerHTML = this.userName;//[newpidian]|[退出] this.scrollToBottom(); //連接socketIO服務(wù)器,newpidian的IP地址 this.socket = io.connect('192.168.3.155:3000'); //向服務(wù)器發(fā)送某用戶已經(jīng)登錄了 this.socket.emit('login', {userId: this.userId, userName: this.userName}); //監(jiān)聽來自服務(wù)器的login,即在客戶端socket.emit('login ')發(fā)送后,客戶端就會收到來自服務(wù)器的 // io.emit('login', {onLineUsers: onLineUsers, onLineCounts: onLineCounts, user: user}); /*監(jiān)聽到有用戶login了,更新信息*/ this.socket.on('login', function (o) { //更新系統(tǒng)信息 CHAT.updateSysMsg(o, 'login'); }); /*監(jiān)聽到有用戶logout了,更新信息*/ this.socket.on('logout', function (o) { CHAT.updateSysMsg(o, 'logout'); }); //var obj = { // userId: this.userId, // userName: this.userName, // content: content //}; /*監(jiān)聽到有用戶發(fā)送消息了*/ this.socket.on("message", function (obj) { //判斷消息是不是自己發(fā)送的 var isMe = (obj.userId === CHAT.userId); var contentDiv = '
' + obj.content + '
'; var userNameDiv = '' + obj.userName + ''; var section = d.createElement('section'); if (isMe) { section.className = 'user'; section.innerHTML = contentDiv + userNameDiv; } else { section.className = 'service'; section.innerHTML = userNameDiv + contentDiv; } CHAT.msgObj.appendChild(section); CHAT.scrollToBottom(); }); } } /*控制鍵鍵碼值(keyCode) 按鍵 鍵碼 按鍵 鍵碼 按鍵 鍵碼 按鍵 鍵碼 BackSpace 8 Esc 27 Right Arrow 39 -_ 189 Tab 9 Spacebar 32 Dw Arrow 40 .> 190 Clear 12 Page Up 33 Insert 45 /? 191 Enter 13 Page Down 34 Delete 46 `~ 192 Shift 16 End 35 Num Lock 144 [{ 219 Control 17 Home 36 ;: 186 \| 220 Alt 18 Left Arrow 37 =+ 187 ]} 221 Cape Lock 20 Up Arrow 38 ,< 188 '" 222 * */ //通過“回車鍵”提交用戶名 d.getElementById('userName').onkeydown = function (e) { console.log(e); e = e || event; if (e.keyCode === 13) { CHAT.userNameSubmit(); } }; //通過“回車鍵”提交聊天內(nèi)容 d.getElementById('content').onkeydown = function (e) { e = e || event; if (e.keyCode === 13) { CHAT.submit(); } }; })();

style.css

秘密

運行結(jié)果

服務(wù)器端已經(jīng)運行,現(xiàn)將客戶端也運行起來得到下圖:

基于Nodejs利用socket.io實現(xiàn)多人聊天室

添加了new和pidian兩個用戶,并發(fā)送信息和進行退出,得到下面的結(jié)果:

基于Nodejs利用socket.io實現(xiàn)多人聊天室

以上所述是小編給大家介紹的基于Nodejs利用socket.io實現(xiàn)多人聊天室,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!


網(wǎng)站名稱:基于Nodejs利用socket.io實現(xiàn)多人聊天室
轉(zhuǎn)載源于:http://weahome.cn/article/ggssho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部