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 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

转载于:https://www.cnblogs.com/derchxi/p/4158208.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Node.js 和 Socket.io 实现多人聊天室的基本步骤: 1. 安装 Node.js 和 Socket.io 首先需要安装 Node.js 和 Socket.io。可以在 Node.js 官网下载并安装 Node.js,然后在命令行中使用以下命令安装 Socket.io: ``` npm install socket.io ``` 2. 创建服务器 创建一个 Node.js 服务器,并在其中引入 Socket.io 模块。创建一个 HTTP 服务器,并使用 Socket.io 将其升级为 WebSocket 服务器。 ```javascript const http = require('http'); const express = require('express'); const socketIO = require('socket.io'); const app = express(); const server = http.createServer(app); const io = socketIO(server); server.listen(3000, () => { console.log('Server listening on port 3000'); }); ``` 3. 监听连接事件 使用 Socket.io 监听 `connection` 事件,当有新的客户端连接到服务器时,触发该事件。 ```javascript io.on('connection', (socket) => { console.log('New client connected'); }); ``` 4. 处理消息事件 在连接事件中,可以监听 `message` 事件,以接收客户端发送的消息。当接收到消息时,将其广播给所有连接到服务器的客户端。 ```javascript io.on('connection', (socket) => { console.log('New client connected'); socket.on('message', (message) => { console.log('Received message: ', message); io.emit('message', message); }); }); ``` 5. 创建客户端 创建一个 HTML 页面作为客户端,使用 Socket.io 连接到服务器,并监听 `message` 事件以接收其他客户端发送的消息。 ```html <!DOCTYPE html> <html> <head> <title>Chat Room</title> <script src="/socket.io/socket.io.js"></script> <script> const socket = io(); socket.on('message', (message) => { const li = document.createElement('li'); li.innerText = message; document.getElementById('messages').appendChild(li); }); function sendMessage() { const input = document.getElementById('messageInput'); socket.emit('message', input.value); input.value = ''; } </script> </head> <body> <ul id="messages"></ul> <input type="text" id="messageInput"> <button onclick="sendMessage()">Send</button> </body> </html> ``` 6. 运行程序 运行 Node.js 服务器,并在浏览器中打开客户端页面。多个客户端连接到服务器后,可以在聊天室中发送消息。 这就是使用 Node.js 和 Socket.io 实现多人聊天室的基本步骤。当然,还可以添加许多其他功能,例如用户身份验证、私人消息等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值