https://cnodejs.org/topic/51d51cd8d44cbfa3047926ba 作者 nswbmw
详细内容大家可以看这个。
由于时间久远,很多代码都过期了。我刚更新了app.js代码。
/** * Module dependencies. */ var express = require('express') , http = require('http') , path = require('path'); var app = express(); // all environments app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); var favicon = require('serve-favicon');//需安装 app.use(favicon(__dirname + '/public/favicon.ico')); var morgan = require('morgan');//需安装 app.use(morgan('dev')); var bodyParser = require('body-parser');//需安装 // parse application/x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended: false })) // parse application/json var cookieParser = require('cookie-parser');//需安装 app.use(cookieParser()); //app.use(app.route); app.use(express.static(path.join(__dirname, 'public'))); var users = {};//存储在线用户列表的对象 app.get('/', function (req, res) { if (null == req.cookies.user) { res.redirect('/signin'); } else { res.sendFile(__dirname + '/views/index.html'); } }); app.get('/signin', function (req, res) { res.sendFile(__dirname + '/views/signin.html'); }); app.post('/signin', function (req, res) { if (users[req.body.name]) { //存在,则不允许登陆 res.redirect('/signin'); } else { //不存在,把用户名存入 cookie 并跳转到主页 res.cookie("user", req.body.name, {maxAge: 1000*60*60*24*30}); res.redirect('/'); } }); var server = http.createServer(app); var io = require('socket.io').listen(server); io.sockets.on('connection', function (socket) { //有人上线 socket.on('online', function (data) { //将上线的用户名存储为 socket 对象的属性,以区分每个 socket 对象,方便后面使用 socket.name = data.user; //users 对象中不存在该用户名则插入该用户名 if (!users[data.user]) { users[data.user] = data.user; } //向所有用户广播该用户上线信息 io.sockets.emit('online', {users: users, user: data.user}); }); //有人发话 socket.on('say', function (data) { if (data.to == 'all') { //向其他所有用户广播该用户发话信息 socket.broadcast.emit('say', data); } else { //向特定用户发送该用户发话信息 //clients 为存储所有连接对象的数组 //var clients = io.sockets.clients(); var clients= io.sockets.sockets; //遍历找到该用户 clients.forEach(function (client) { if (client.name == data.to) { //触发该用户客户端的 say 事件 client.emit('say', data); } }); } }); //有人下线 socket.on('disconnect', function() { //若 users 对象中保存了该用户名 if (users[socket.name]) { //从 users 对象中删除该用户名 delete users[socket.name]; //向其他所有用户广播该用户下线信息 socket.broadcast.emit('offline', {users: users, user: socket.name}); } }); }); server.listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });
工具,webstorm