前幾天晚上邊看水滸邊寫的nodejs的聊天室,前面說了,放假之前要把近日學(xué)習(xí)nodejs的所有心得整理下,今天就是30號(hào)鳥~撒歡~,最后放這個(gè)聊天室出來給大家作為學(xué)習(xí)nodejs的參考示例,希望對(duì)大家有用。
感謝:cnodejs群里的老雷,及其微博上的基友們!順祝大家長假快樂,順祝自己明天動(dòng)車不出軌,順祝明年不再過節(jié),感慨多了……
聊天室主要功能及其特點(diǎn):
廢話不多說了,注意點(diǎn),基本前面的文章都提到了,下面羅列下:
《配置nodejs.exe的windows目錄結(jié)構(gòu)》
《安裝express及配置app.js文件》
《使用socket.io和node.js搭建websocket應(yīng)用》
《在Express和Socket.IO中使用session》
//========================變量定義===============================/** * modules引入 */var express = require('express'), sio = require('socket.io'), fs=require('fs'), path = require('path') url = require('url'), parseCookie = require('connect').utils.parseCookie, MemoryStore = require('connect/middleware/session/memory'); /** * 私人聊天使用session */var usersWS = {}, //私人聊天用的websocket storeMemory = new MemoryStore({ reapInterval: 60000 * 10 });//session store//=========================app配置============================= /** * app配置 */var app = module.export = express.createServer(); app.configure(function(){ app.use(express.bodyParser()); app.use(express.cookieParser()); app.use(express.session({ secret: 'wyq', store:storeMemory })); app.use(express.methodOverride()); app.use(app.router);//要放在bodyParser之后,處理post app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.static(__dirname + '/public'));});//=================配置socket.io=========================/** * 配置socket.io * */ var io = sio.listen(app);//設(shè)置sessionio.set('authorization', function(handshakeData, callback){ // 通過客戶端的cookie字符串來獲取其session數(shù)據(jù) handshakeData.cookie = parseCookie(handshakeData.headers.cookie) var connect_sid = handshakeData.cookie['connect.sid']; if (connect_sid) { storeMemory.get(connect_sid, function(error, session){ if (error) { // if we cannot grab a session, turn down the connection callback(error.message, false); } else { // save the session data and accept the connection handshakeData.session = session; callback(null, true); } }); } else { callback('nosession'); }});//=========================URL=============================/** * url處理開始鳥~ * @param {Object} req * @param {Object} res */app.get('/',function(req,res){ if( req.session.name && req.session.name!==''){ //需要判斷下是否已經(jīng)登錄 res.redirect('/chat'); }else{ //讀取登錄頁面,要求登錄 var realpath = __dirname + '/views/' + url.parse('login.html').pathname; var txt = fs.readFileSync(realpath); res.end(txt); }});app.get('/chat',function(req,res){ if (req.session.name && req.session.name !== '') { //需要判斷下是否已經(jīng)登錄 res.render('chat',{name:req.session.name}); }else{ res.redirect('/'); }})app.post('/chat',function(req,res){ var name = req.body.nick; if(name && name!==''){ req.session.name = name;//設(shè)置session res.render('chat',{name:name}); }else{ res.end('nickname cannot null'); } }); //===================socket鏈接監(jiān)聽=================/** * 開始socket鏈接監(jiān)聽 * @param {Object} socket */io.sockets.on('connection', function (socket){ var session = socket.handshake.session;//session var name = session.name; usersWS[name] = socket; var refresh_online = function(){ var n = []; for (var i in usersWS){ n.push(i); } io.sockets.emit('online list', n);//所有人廣播 } refresh_online(); socket.broadcast.emit('system message', '【'+name + '】回來了,大家趕緊去找TA聊聊~~'); //公共信息 socket.on('public message',function(msg, fn){ socket.broadcast.emit('public message', name, msg); fn(true); }); //私人@信息 socket.on('private message',function(to, msg, fn){ var target = usersWS[to]; if (target) { fn(true); target.emit('private message', name+'[私信]', msg); } else { fn(false) socket.emit('message error', to, msg); } }); //掉線,斷開鏈接處理 socket.on('disconnect', function(){ delete usersWS[name]; session = null; socket.broadcast.emit('system message', '【'+name + '】無聲無息地離開了。。。'); refresh_online(); }); }); //===========app listen 開始鳥~==========app.listen(3000, function(){ var addr = app.address(); console.log('app listening on http://127.0.0.1:' + addr.port);});
聯(lián)系客服