首页 > 代码库 > nodejs 实例 使用 Express + Socket.IO 搭建多人聊天室

nodejs 实例 使用 Express + Socket.IO 搭建多人聊天室

 https://cnodejs.org/topic/51d51cd8d44cbfa3047926ba 作者 nswbmw

详细内容大家可以看这个。

由于时间久远,很多代码都过期了。我刚更新了app.js代码。

/** * Module dependencies. */var express = require(‘express‘)    , http = require(‘http‘)    , path = require(‘path‘);var app = express();// all environmentsapp.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-urlencodedapp.use(bodyParser.urlencoded({ extended: false }))// parse application/jsonvar 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

nodejs 实例 使用 Express + Socket.IO 搭建多人聊天室