您现在的位置:首页 --> JavaScript --> 基于express+socket.io的nodejs聊天室
基于express+socket.io的nodejs聊天室
浏览:3604次 出处信息
前几天晚上边看水浒边写的nodejs的聊天室,前面说了,放假之前要把近日学习nodejs的所有心得整理下,今天就是30号鸟~撒欢~,最后放这个聊天室出来给大家作为学习nodejs的参考示例,希望对大家有用。
感谢:cnodejs群里的老雷,及其微博上的基友们!顺祝大家长假快乐,顺祝自己明天动车不出轨,顺祝明年不再过节,感慨多了……
特点
聊天室主要功能及其特点:
废话不多说了,注意点,基本前面的文章都提到了,下面罗列下:
《配置nodejs.exe的windows目录结构》
《安装express及配置app.js文件》
《使用socket.io和node.js搭建websocket应用》
《在Express和Socket.IO中使用session》
nodejs聊天室下载地址
聊天室服务器端js代码
//========================变量定义=============================== /** * 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); //设置session io.set('authorization', function(handshakeData, callback){ // 通过客户端的cookie字符串来获取其session数据 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!==''){ //需要判断下是否已经登录 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 !== '') { //需要判断下是否已经登录 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;//设置session res.render('chat',{name:name}); }else{ res.end('nickname cannot null'); } }); //===================socket链接监听================= /** * 开始socket链接监听 * @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); });
建议继续学习:
- 推荐一些socket工具,TCP、UDP调试、抓包工具 (阅读:9480)
- 推荐一些socket工具,TCP、UDP调试、抓包工具 (阅读:7334)
- 用unix socket加速php-fpm、mysql、redis的连接 (阅读:6601)
- 浅析linux kernel network之socket创建 (阅读:5766)
- 为什么我们要从 NodeJS 迁移到 Ruby on Rails (阅读:5471)
- JavaScript,只有你想不到 (阅读:5173)
- Nodejs和MongoDB初体验 (阅读:5041)
- nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket (阅读:5054)
- web socket 心跳包的实现方案 (阅读:4978)
- python中的socket代理 (阅读:4867)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
后一篇:javascript获取隐藏dom的宽高 >>
文章信息
- 作者:断桥残雪 来源: 断桥残雪部落格
- 标签: express nodejs socket 聊天室
- 发布时间:2011-10-14 13:51:00
建议继续学习
近3天十大热文
- [69] Twitter/微博客的学习摘要
- [69] IOS安全–浅谈关于IOS加固的几种方法
- [66] 如何拿下简短的域名
- [64] android 开发入门
- [63] find命令的一点注意事项
- [63] Go Reflect 性能
- [62] 流程管理与用户研究
- [61] Oracle MTS模式下 进程地址与会话信
- [60] 图书馆的世界纪录
- [60] 读书笔记-壹百度:百度十年千倍的29条法则