Nodejs中socket.io如何给指定的客户端发送自定义事件?

Nodejs中socket.io如何给指定的客户端发送自定义事件?

如题。。另外想问一下哪里有socket.io的教程啊,感觉socket.io官网上的例子太简单,而且有些写法似乎有问题。

4 回复

Node.js 中 Socket.io 如何给指定的客户端发送自定义事件?

Socket.io 是一个非常强大的库,用于在 Node.js 应用程序中实现实时双向通信。有时你可能需要向特定的客户端发送自定义事件,而不是广播到所有连接的客户端。以下是如何做到这一点的方法。

示例代码

首先,确保你已经安装了 socket.io

npm install socket.io

接下来,我们创建一个简单的服务器端应用,监听客户端的连接,并向特定客户端发送自定义事件。

服务器端代码(server.js)

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

io.on('connection', (socket) => {
    console.log(`Client connected: ${socket.id}`);

    // 监听自定义事件
    socket.on('customEvent', (data) => {
        console.log(`Received custom event from client: ${JSON.stringify(data)}`);
        
        // 向特定客户端发送自定义事件
        const targetSocketId = 'clientSocketIdHere';  // 替换为实际的目标客户端ID
        if (io.sockets.sockets[targetSocketId]) {
            io.sockets.sockets[targetSocketId].emit('responseEvent', { message: 'Hello from server!', data });
        } else {
            console.log('Target client not found.');
        }
    });

    // 客户端断开连接时的处理
    socket.on('disconnect', () => {
        console.log(`Client disconnected: ${socket.id}`);
    });
});

客户端代码(client.html)

<!DOCTYPE html>
<html>
<head>
    <title>Socket.io Example</title>
</head>
<body>
    <button onclick="sendCustomEvent()">Send Custom Event</button>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        const socket = io('http://localhost:3000');

        function sendCustomEvent() {
            const data = { key: 'value' };
            socket.emit('customEvent', data);
        }

        socket.on('responseEvent', (data) => {
            console.log('Response from server:', data);
        });
    </script>
</body>
</html>

解释

  1. 服务器端

    • 使用 socket.io 创建一个服务器实例。
    • 当客户端连接时,会触发 'connection' 事件。
    • 'customEvent' 事件处理器中,你可以通过 socket.id 获取当前连接的客户端ID。
    • 使用 io.sockets.sockets[socketId] 找到目标客户端,并调用 .emit() 方法发送自定义事件。
  2. 客户端

    • 客户端通过点击按钮发送自定义事件。
    • 服务器接收到该事件后,可以向特定的客户端发送响应事件。

教程资源

  • 官方文档:虽然你提到官方文档有些简单,但仍是很好的起点。你可以查看 Socket.io 官方文档
  • 在线教程:有许多网站提供更详细的教程和示例,例如 MDN Web Docs,或者一些技术博客和视频教程。

希望这些信息对你有所帮助!


缓存每个Client就行了

之前試寫的聊天, 主要是io.sockets.emit(‘updatechat’, socket.username, message);

io.sockets.on ( ‘connection’, function(socket) { // when the client emits ‘sendchat’, this listens and executes socket.on ( ‘sendchat’, function(message) { //socket.broadcast.emit //( // ‘updatechat’, { Content: message } //);

			io.sockets.emit('updatechat', socket.username, message);
		}
	);
// when the client emits 'adduser', this listens and executes
socket.on
(
	'adduser', function(username)
	{
		// we store the username in the socket session for this client
		socket.username = username;
		// add the client's username to the global list
		usernames[username] = username;
		// echo to client they've connected
		socket.emit('updatechat', 'SERVER', 'you have connected');
		// echo globally (all clients) that a person has connected
		socket.broadcast.emit('updatechat', 'SERVER', username + ' has connected');
		// update the list of users in chat, client-side
		io.sockets.emit('updateusers', usernames);
	}
);

// when the user disconnects.. perform this
socket.on
(
	'disconnect', function()
	{
		// remove the username from global usernames list
		delete usernames[socket.username];
		// update list of users in chat, client-side
		io.sockets.emit('updateusers', usernames);
		// echo globally that this client has left
		socket.broadcast.emit('updatechat', 'SERVER', socket.username + ' has disconnected');
	}
);

}

);

要实现使用 socket.io 给指定的客户端发送自定义事件,你可以通过为每个连接到服务器的客户端分配一个唯一的标识符(例如房间名或用户ID)来管理客户端。然后,你可以使用该标识符将消息定向发送给特定的客户端。

示例代码

  1. 初始化服务器和客户端

    首先,你需要安装 socket.io

    npm install socket.io
    
  2. 服务器端代码

    const io = require('socket.io')(server);
    
    // 存储所有连接的客户端
    let clients = {};
    
    io.on('connection', (socket) => {
      console.log('A user connected:', socket.id);
    
      // 假设我们从客户端接收到用户的ID
      socket.on('setUserId', (userId) => {
        clients[userId] = socket;
        console.log(`User ID ${userId} is connected.`);
      });
    
      // 当需要向特定用户发送消息时
      socket.on('sendToUser', (data, userId) => {
        if (clients[userId]) {
          clients[userId].emit('customEvent', data);
        } else {
          console.log(`User ID ${userId} not found.`);
        }
      });
    });
    
  3. 客户端代码

    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io();
    
      // 设置用户ID
      function setUserId(userId) {
        socket.emit('setUserId', userId);
      }
    
      // 向指定用户发送自定义事件
      function sendMessageToUser(userId, data) {
        socket.emit('sendToUser', data, userId);
      }
    
      // 接收自定义事件
      socket.on('customEvent', (data) => {
        console.log('Received custom event:', data);
      });
    </script>
    

解释

  • 在服务器端,我们维护了一个存储所有客户端的映射表 clients
  • 当客户端连接时,我们使用 socket.on('setUserId', ...) 来设置用户的唯一标识符,并将其与当前连接的 socket 关联起来。
  • 使用 socket.on('sendToUser', ...) 方法,我们可以根据用户ID将消息定向发送给特定的客户端。
  • 客户端代码展示了如何设置用户ID并发送自定义事件。

通过这种方式,你可以轻松地将消息定向发送给特定的客户端,而不仅仅是广播给所有连接的客户端。对于更复杂的场景,你可能还需要考虑更多的状态管理和错误处理。

回到顶部