在线聊天室(带历史记录显示功能)
依赖环境:node.js
依赖的模块:express, socket.io
示例代码见附件,解压后运行: npm install ,安装依赖模块,然后运行机制:node index.js
浏览器访问:localhost:3000/index.html
服务端代码:
var express = require('express'); var app = express(); var path = require('path'); var http = require('http').Server(app); var io = require('socket.io')(http); app.use(express.static(path.join(__dirname, 'public'))); app.get('/', function(req, res){ res.send('<h1>Welcome Realtime Server</h1>'); }); //在线用户 var onlineUsers = {}; //当前在线人数 var onlineCount = 0; // 消息记录 var messageList = []; io.on('connection', function(socket){ console.log('a user connected'); //监听新用户加入 socket.on('login', function(obj){ //将新加入用户的唯一标识当作socket的名称,后面退出的时候会用到 socket.name = obj.userid; //检查在线列表,如果不在里面就加入 if(!onlineUsers.hasOwnProperty(obj.userid)) { onlineUsers[obj.userid] = obj.username; //在线人数+1 onlineCount++; } //向所有客户端广播用户加入 io.emit('login', {onlineUsers:onlineUsers, onlineCount:onlineCount, user:obj}); console.log(obj.username+'加入了聊天室'); // 向刚加入的用户推送历史消息 console.log("userid:"+obj.userid); console.log("socketid:"+socket.id); io.sockets.connected[socket.id].emit('messageHistory', {messageList: messageList}); }); //监听用户退出 socket.on('disconnect', function(){ //将退出的用户从在线列表中删除 if(onlineUsers.hasOwnProperty(socket.name)) { //退出用户的信息 var obj = {userid:socket.name, username:onlineUsers[socket.name]}; //删除 delete onlineUsers[socket.name]; //在线人数-1 onlineCount--; //向所有客户端广播用户退出 io.emit('logout', {onlineUsers:onlineUsers, onlineCount:onlineCount, user:obj}); console.log(obj.username+'退出了聊天室'); } }); //监听用户发布聊天内容 socket.on('message', function(obj){ //向所有客户端广播发布的消息 io.emit('message', obj); messageList.push(obj); console.log(obj.username+'说:'+obj.content); }); }); http.listen(3000, function(){ console.log('listening on *:3000'); });