Nodejs中sockot.io如何动态地创建频道?

Nodejs中sockot.io如何动态地创建频道?

比如平时的代码都是

socket.on(‘public message’, function (data) {

socket.on(‘user message’, function (data) {

这样硬编码进去的,如果用户通过表单自建频道,比如新建一个nodejs频道, 代码如何写呢?

3 回复

要在Node.js中使用Socket.IO动态地创建频道(或房间),可以通过Socket.IO的joinleave方法来实现。用户可以通过表单提交新频道的名称,并通过Socket.IO连接到服务器后自动加入该频道。

以下是一个简单的示例代码,演示如何实现动态创建和加入频道的功能:

服务器端代码

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

// 创建Express应用
const app = express();
const server = http.createServer(app);
const io = socketIo(server);

// 存储所有房间
let rooms = [];

// 处理新频道创建请求
app.post('/create-room', (req, res) => {
    const roomName = req.body.roomName;
    
    // 检查房间是否已存在
    if (!rooms.includes(roomName)) {
        rooms.push(roomName);
        res.send({ success: true, message: `Room ${roomName} created successfully.` });
    } else {
        res.status(400).send({ success: false, message: 'Room already exists.' });
    }
});

// 监听客户端连接事件
io.on('connection', (socket) => {
    console.log('A user connected:', socket.id);

    // 接收用户创建房间的请求
    socket.on('create-room', (data) => {
        const roomName = data.roomName;

        // 如果房间不存在,则创建并加入
        if (!rooms.includes(roomName)) {
            rooms.push(roomName);
            socket.join(roomName);
            io.to(roomName).emit('room-created', { roomName });
            console.log(`Room ${roomName} created and joined by user.`);
        } else {
            socket.emit('room-exists', { roomName });
        }
    });

    // 用户可以随时加入或离开房间
    socket.on('join-room', (data) => {
        const roomName = data.roomName;
        if (rooms.includes(roomName)) {
            socket.join(roomName);
            io.to(roomName).emit('user-joined', { roomName, userId: socket.id });
        } else {
            socket.emit('room-not-found', { roomName });
        }
    });

    socket.on('disconnect', () => {
        console.log('User disconnected:', socket.id);
        // 可以在这里处理用户断开连接后的清理逻辑
    });
});

// 启动服务器
server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Dynamic Room Creation with Socket.IO</title>
    <script src="/socket.io/socket.io.js"></script>
</head>
<body>
    <form id="createRoomForm">
        <input type="text" id="roomName" placeholder="Enter room name">
        <button type="submit">Create Room</button>
    </form>

    <script>
        const socket = io();

        document.getElementById('createRoomForm').addEventListener('submit', (event) => {
            event.preventDefault();
            const roomName = document.getElementById('roomName').value;

            socket.emit('create-room', { roomName }, (response) => {
                if (response.success) {
                    alert(`Room ${roomName} created successfully.`);
                } else {
                    alert(response.message);
                }
            });
        });

        // 用户可以选择加入房间
        function joinRoom(roomName) {
            socket.emit('join-room', { roomName });
        }

        // 示例:用户输入房间名后加入
        document.getElementById('roomName').addEventListener('change', () => {
            const roomName = document.getElementById('roomName').value;
            if (roomName) {
                joinRoom(roomName);
            }
        });
    </script>
</body>
</html>

解释

  1. 服务器端

    • 使用expresssocket.io创建一个Web服务器。
    • 提供一个HTTP POST路由/create-room用于创建新的房间。
    • 当客户端连接时,监听create-roomjoin-room事件,动态地创建和加入房间。
    • 使用socket.join(roomName)将客户端加入指定的房间。
  2. 客户端

    • 一个简单的HTML表单允许用户输入房间名称并创建房间。
    • 发送create-room事件给服务器,并根据响应提示用户房间是否创建成功。
    • 用户还可以通过输入框输入房间名称并调用join-room事件加入房间。

通过这种方式,你可以动态地创建和管理频道(房间),使用户能够自由选择加入不同的房间进行交流。


我做过一个聊天室的例子,下面是代码片段,提供一个思路 io.sockets.on(‘connection’, function (socket) { socket.on(‘sign in’, function (data) { var roomId = data.roomId; //保存房间 socket.set(‘room’,roomId,function(){ console.log(“房间号:”+room_id+“已保存”); }); socket.join(roomId); socket.broadcast.to(roomId).emit(‘system message’, ‘欢迎XX光临~’); }); socket.on(‘message’,function(){ socket.get(‘room’, function(err, room){ io.sockets.in(room).emit(‘message’, ‘some msg’); }) }) })

要在Node.js中使用Socket.IO动态地创建频道(房间),你可以使用Socket.IO的joinleave方法来实现。当用户通过表单自建频道时,可以通过指定频道名称来加入相应的频道。

以下是一个简单的示例代码,展示了如何动态地创建频道并让用户加入:

服务器端代码

const io = require('socket.io')(server);

io.on('connection', (socket) => {
    console.log('A user connected:', socket.id);

    // 监听用户创建频道的事件
    socket.on('createChannel', (channelName) => {
        console.log(`User ${socket.id} created channel: ${channelName}`);
        socket.join(channelName);
    });

    // 监听用户发送消息的事件
    socket.on('sendMessage', (data) => {
        const { channelName, message } = data;
        console.log(`Message sent to channel ${channelName}:`, message);
        io.to(channelName).emit('newMessage', message);
    });

    // 监听用户断开连接的事件
    socket.on('disconnect', () => {
        console.log('A user disconnected:', socket.id);
    });
});

客户端代码

<script src="/socket.io/socket.io.js"></script>
<script>
    const socket = io();

    // 创建频道
    function createChannel(channelName) {
        socket.emit('createChannel', channelName);
    }

    // 发送消息
    function sendMessage(channelName, message) {
        socket.emit('sendMessage', { channelName, message });
    }

    // 连接到服务器
    socket.on('connect', () => {
        console.log('Connected to server');
    });

    // 接收新消息
    socket.on('newMessage', (message) => {
        console.log('New message:', message);
    });
</script>

使用示例

  1. 用户通过表单输入频道名称,例如 nodejs
  2. 调用 createChannel('nodejs') 方法来创建频道。
  3. 用户可以调用 sendMessage('nodejs', 'Hello World!') 来发送消息到 nodejs 频道。
  4. 其他连接到同一频道的客户端会收到 newMessage 事件,并显示新消息。

通过这种方式,你可以灵活地动态创建频道,并让不同的用户根据需要加入不同的频道。

回到顶部