Nodejs socket.io 每个人侦听不同的事件靠谱吗?
Nodejs socket.io 每个人侦听不同的事件靠谱吗?
s.on(“message”,function(data){ var time = data.time; s.emit(“tock”+time,“msg”); })
这样写靠谱吗? 可以用动态 事件吗?
当然可以。在使用 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>
解释
-
服务器端:
- 当一个新的客户端连接时,它会触发
join
事件。 - 我们从客户端接收用户名,并创建一个针对该用户名的事件监听器
sendTo-<username>
。 - 每隔一秒,服务器会向客户端发送一个特定的事件
tick-<username>
。
- 当一个新的客户端连接时,它会触发
-
客户端:
- 用户输入他们的用户名,并通过
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应用中为每个用户定制通信逻辑。