Nodejs socket.io 每个人侦听不同的事件靠谱吗?

Nodejs socket.io 每个人侦听不同的事件靠谱吗?

s.on(“message”,function(data){ var time = data.time; s.emit(“tock”+time,“msg”); })

这样写靠谱吗? 可以用动态 事件吗?

8 回复

当然可以。在使用 Node.js 和 Socket.IO 时,允许每个客户端侦听不同的事件是一种非常灵活且强大的方式。这种做法可以让你根据客户端的需求动态地处理不同的事件,从而实现更个性化的通信。

示例代码

假设你有一个简单的聊天应用,其中每个用户都有一个唯一的标识符(例如用户名或用户ID)。你可以为每个用户创建不同的事件监听器,并向他们发送特定的消息。

服务器端代码 (server.js)

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

io.on('connection', function(socket) {
    // 假设我们从客户端接收到一个用户名
    socket.on('join', function(username) {
        console.log(`${username} joined the chat.`);
        
        // 动态创建事件监听器
        socket.on(`sendTo-${username}`, function(data) {
            console.log(`${username} sent: ${data.message}`);
            // 向所有其他用户广播消息
            socket.broadcast.emit('newMessage', { message: data.message, from: username });
        });

        // 动态发送消息给特定的用户
        setInterval(() => {
            socket.emit(`tick-${username}`, 'Hello, this is a tick message!');
        }, 1000);
    });

    socket.on('disconnect', function() {
        console.log('A user disconnected.');
    });
});

客户端代码 (client.js)

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

    // 连接到服务器并提供用户名
    let username = prompt("Enter your username:");
    socket.emit('join', username);

    // 发送消息到特定用户
    document.getElementById('sendMessage').addEventListener('click', () => {
        let message = document.getElementById('messageInput').value;
        socket.emit(`sendTo-${username}`, { message: message });
    });

    // 监听来自特定用户的事件
    socket.on(`tick-${username}`, function(message) {
        console.log(`Received: ${message}`);
        document.getElementById('chatBox').innerHTML += `<div>${message}</div>`;
    });
</script>

解释

  1. 服务器端:

    • 当一个新的客户端连接时,它会触发 join 事件。
    • 我们从客户端接收用户名,并创建一个针对该用户名的事件监听器 sendTo-<username>
    • 每隔一秒,服务器会向客户端发送一个特定的事件 tick-<username>
  2. 客户端:

    • 用户输入他们的用户名,并通过 join 事件发送给服务器。
    • 用户可以发送消息到特定的用户,这将触发 sendTo-<username> 事件。
    • 客户端监听特定的事件 tick-<username>,并在页面上显示这些消息。

这种方法不仅灵活,而且可以根据具体需求进行扩展。


不靠谱,会内存泄露,node.js会提示监听的事件过多

类似现在双屏互动的游戏,如何建立 一一对应的关系, 事件是一样的,但频道id 是部一样的 , 也就是 一个手机对应一个 pc 这样互动, 这个 在 socket.io 怎么操作呢?

虽然没听的很明白,不过 如果频道ID不一样,就多创建一个ID 是两者一样就好了

完全靠谱。 这只是带内事件(消息名),每个Socket.io的Socket都有EventEmitter接口。 就好比每家有自己的邮箱,往不同邮箱写信,你可以用任意的信封(消息名),但要收信人愿意处理这种消息。 即便你使用相同的消息名,占用的系统资源也是一样多的。 你可以看看 https://github.com/joyent/node/blob/master/lib/events.js

我的意思是 如何让 两个设备 可以匹配,一台设备只能操作另一台 ,而不是 操作所有设备

首先感谢 ~照这么说的话 用户退出的时候 需要人为的 去删除该事件的侦听吗?

在Node.js中使用Socket.io时,每个人侦听不同的事件是完全可行的,并且这种方式在某些场景下非常有用。你的代码示例已经展示了如何为每个客户端动态创建不同的事件名。

以下是一个更完整的示例代码,展示如何使用动态事件名来处理不同用户的特定消息:

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

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

    // 假设我们有一个函数可以为每个用户生成一个唯一的事件名
    function generateEventName(userId) {
        return `user_${userId}_message`;
    }

    // 示例:假设我们有一个特定的用户ID
    const userId = '12345';
    const eventName = generateEventName(userId);

    // 监听特定用户的消息事件
    socket.on(eventName, (data) => {
        console.log(`Received message for user ${userId}:`, data);
        
        // 将消息发送回特定用户
        socket.emit(`response_${eventName}`, { msg: 'Your message was received!' });
    });

    // 当用户断开连接时
    socket.on('disconnect', () => {
        console.log('User disconnected:', socket.id);
    });
});

解释:

  • generateEventName 函数用于生成每个用户的唯一事件名。
  • socket.on(eventName, callback) 用于监听特定用户的消息事件。
  • 当接收到消息时,将响应消息发送回相同的用户。

这种方式不仅合理,而且非常灵活,允许你在Socket.io应用中为每个用户定制通信逻辑。

回到顶部