Nodejs socket.io创建多个监听房间

Nodejs socket.io创建多个监听房间

就是我想实现一个五子棋的服务器 其中就是分很多房间room1 room2 room3 …… 但是现在我就写了一个 var app = module.exports = express.createServer(); var io = require(‘socket.io’).listen(app); room1=io.of(’/room1’).on(‘connection’,function(socket){ socket.emit(………………); ……………… }); 我现在要是想写room2 room3……什么的是不是要复制上面这一段代码为 room2=io.of(’/room2’).on(‘connection’,function(socket){ ……………… }); room3=……………… room4=………………

但是这样的话,服务器写几个room 客户端就只有这么多个房间可以选择连接 可是我想是,客户端自定义一个房间号码 比如23,发送到服务器,然后服务器创建一个room23
然后这个room23 实现上面如room1的功能和监听事件 不知道该怎么办


6 回复

当然可以!为了实现你所描述的需求,我们可以使用动态创建房间的方式来处理客户端自定义的房间号。这样,无论客户端请求连接哪个房间,服务器都可以动态地创建并管理这些房间。

示例代码

首先,我们需要安装 socket.io 库:

npm install socket.io

然后,我们可以在 Node.js 中编写服务器端代码来实现动态创建房间的功能:

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

// 创建 Express 应用
const app = express();

// 创建 HTTP 服务器
const server = http.createServer(app);

// 使用 socket.io 监听 HTTP 服务器
const io = socketIo(server);

// 存储所有房间的映射
const rooms = {};

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

    // 监听客户端发送的房间号
    socket.on('joinRoom', (roomName) => {
        if (!rooms[roomName]) {
            // 如果房间不存在,则创建新房间
            rooms[roomName] = io.of(`/${roomName}`);
            console.log(`Created new room: ${roomName}`);
        }

        // 加入指定的房间
        rooms[roomName].emit('message', `${socket.id} has joined the room ${roomName}`);
        rooms[roomName].sockets.add(socket);
        
        // 发送成功加入房间的消息
        socket.join(roomName);
        socket.emit('joinedRoom', { roomName });

        // 监听房间内的消息
        socket.on('chatMessage', (msg) => {
            rooms[roomName].emit('chatMessage', `${socket.id}: ${msg}`);
        });

        // 当客户端断开连接时,从房间中移除
        socket.on('disconnect', () => {
            rooms[roomName].sockets.delete(socket);
            rooms[roomName].emit('message', `${socket.id} has left the room ${roomName}`);
            if (rooms[roomName].sockets.size === 0) {
                delete rooms[roomName];
                console.log(`Deleted empty room: ${roomName}`);
            }
        });
    });
});

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

解释

  1. 创建 Express 和 HTTP 服务器:

    • 我们首先创建了一个 Express 应用,并通过 http.createServer 方法创建了一个 HTTP 服务器。
    • 然后,我们使用 socket.io 来监听这个 HTTP 服务器。
  2. 存储房间:

    • 我们使用一个对象 rooms 来存储所有已创建的房间。
  3. 处理客户端连接:

    • 当客户端连接时,我们监听客户端发送的 joinRoom 事件。
    • 如果客户端请求的房间不存在,我们就创建一个新的房间。
    • 客户端加入房间后,我们监听该房间内的 chatMessage 事件,并将消息广播给房间中的其他客户端。
    • 当客户端断开连接时,我们从房间中移除该客户端,并且如果房间中没有其他客户端了,我们就删除该房间。
  4. 启动服务器:

    • 最后,我们启动服务器并监听端口 3000。

通过这种方式,你可以动态地创建和管理任意数量的房间,而不需要预先定义每个房间。


要是我实现你这东西的话绝对不按你这个思路,你这个思路说难听点真的是有点那个啥了。 为什么表面的“房间号“要真正的区分呢,服务端其实只需要一个”大的房间“,收集所有的连接实例,当几个人在一个房间里面的时候不必要去正在的像你那样建立一个房间,你可以把这个几个连接实例抽出来组成一个数组去实现小组内的广播等,只要你稍微自定义一下进入房间后发的消息格式就好了。

对哦。。。学习了 - -

写一个房间的对象,对象包括 房间名称,房间人数,玩家的状态。

在写一个房间管理器。 管理器里指定了房间的个数。 房间的状态,寻找空闲房间等。 通过manager 来管理obj

of提供路由功能,房间的话用in

https://github.com/LearnBoost/socket.io/wiki/Rooms

为了实现在客户端自定义房间号并由服务器动态创建房间的需求,你可以使用 socket.io 的动态命名空间功能。这样客户端可以请求加入任何他们想要的房间(例如,房间号为23),服务器会根据这个请求动态地创建或加入相应的房间。

下面是具体的实现步骤和示例代码:

服务器端代码

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

// 创建默认房间(例如room1)
const defaultRoom = 'room1';
io.of(defaultRoom).on('connection', function(socket) {
    console.log(`User connected to ${defaultRoom}`);
    // 在这里处理与该房间相关的逻辑
});

io.on('connection', function(socket) {
    socket.on('joinCustomRoom', function(roomName) {
        // 检查是否已存在该房间
        let namespace = io.of(`/${roomName}`);
        if (!namespace) {
            // 如果不存在,则创建新的命名空间
            namespace = io.of(`/${roomName}`);
            namespace.on('connection', function(customSocket) {
                console.log(`User connected to custom room: ${roomName}`);
                // 在这里处理与自定义房间相关的逻辑
            });
        }

        // 将当前用户加入指定的房间
        socket.join(roomName);
        console.log(`${socket.id} joined ${roomName}`);

        // 可以向所有在特定房间中的客户端广播消息
        namespace.to(roomName).emit('message', `${socket.id} has joined the room.`);
    });
});

http.listen(3000, function() {
    console.log('listening on *:3000');
});

客户端代码

<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io('/room1'); // 连接到默认房间
    var customRoomName = 'room23'; // 客户端自定义的房间名

    socket.emit('joinCustomRoom', customRoomName); // 发送请求以加入自定义房间

    // 在客户端处理来自服务器的消息
    socket.on('message', function(msg) {
        console.log(msg);
    });
</script>

这段代码展示了如何在 socket.io 中创建多个动态命名空间(即“房间”),允许客户端自定义连接的房间。客户端通过发送一个特殊的事件(在这个例子中是 joinCustomRoom)来请求加入一个新房间,如果该房间尚不存在,则服务器将创建一个新的命名空间并将其分配给该房间。

回到顶部