Nodejs WebSocket有没有可以支持从Server直接send给某个特定Client的方法?

Nodejs WebSocket有没有可以支持从Server直接send给某个特定Client的方法?

看了看nodejs的websocket文档(https://github.com/Worlize/WebSocket-Node/wiki/Documentation),其中的几个send方法都是向当前client发送的。

有没有向特定client发送方法的呢,就比如说client A想push一条信息给client B

原理应该是 client A =>> send_msg =>> server =>> send_msg_2 =>> client B

这个 send_msg_2 大家都是如何实现的?


6 回复

当然可以。在Node.js中使用WebSocket时,确实存在一种方法来实现从服务器向特定客户端发送消息的功能。以下是一个简单的示例,展示如何通过WebSocket实现这一功能。

示例代码

首先,我们需要安装一个WebSocket库,比如ws

npm install ws

然后,我们可以创建一个简单的WebSocket服务器和客户端:

WebSocket服务器代码

const WebSocket = require('ws');

// 创建一个新的WebSocket服务器
const wss = new WebSocket.Server({ port: 8080 });

// 存储所有连接的客户端
const clients = {};

wss.on('connection', (ws) => {
  console.log('A client connected');

  // 将新的客户端添加到clients对象中
  ws.on('message', (message) => {
    const data = JSON.parse(message);
    if (data.type === 'register') {
      clients[data.id] = ws;
      console.log(`Client ${data.id} registered`);
    }
  });

  ws.on('close', () => {
    console.log('A client disconnected');
    // 当客户端断开连接时,从clients对象中移除
    for (let id in clients) {
      if (clients[id] === ws) {
        delete clients[id];
        break;
      }
    }
  });
});

// 向特定客户端发送消息的函数
function sendMessageToClient(clientId, message) {
  if (clients[clientId]) {
    clients[clientId].send(JSON.stringify(message));
  } else {
    console.log(`Client ${clientId} not found`);
  }
}

// 测试:向客户端ID为'clientB'的客户端发送消息
setTimeout(() => {
  sendMessageToClient('clientB', { type: 'notification', content: 'Hello from the server!' });
}, 5000);

WebSocket客户端代码

客户端需要先注册自己的ID:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>WebSocket Client</title>
</head>
<body>
  <script>
    const socket = new WebSocket('ws://localhost:8080');

    // 注册客户端ID
    socket.send(JSON.stringify({ type: 'register', id: 'clientB' }));

    socket.onmessage = function(event) {
      console.log('Received:', event.data);
    };
  </script>
</body>
</html>

解释

  1. WebSocket服务器:我们创建了一个WebSocket服务器,并使用一个对象clients来存储所有连接的客户端。
  2. 客户端注册:当客户端连接时,它会发送一个包含其ID的消息,我们将该ID与对应的WebSocket实例关联起来。
  3. 发送消息:定义了一个sendMessageToClient函数,用于向特定的客户端发送消息。如果客户端存在,则通过其WebSocket实例发送消息。
  4. 测试:在服务器端的代码中,我们使用setTimeout模拟了一个场景,在5秒后向ID为clientB的客户端发送一条消息。

通过这种方式,服务器可以根据客户端的ID选择性地向特定的客户端发送消息。


= =解决了…

服务端自己要维护所有的会话,“知道”每个tcp连接与客户端的对应关系。

请问你的解决方案是如何的呢?谢谢,我也正好需要

2楼的方法说的就是正确的

server端要存取/维护所有的会话,并且记录每个connection与客户端的对应关系。我这边暂时用的Hash来存取

比如说,一个connection对象的结构是这样的

var connObj = { id: uidxxxx, data: { name: xxx, talk_with: [xxx, xxx, xxx], connection: connection, info: xxx } }

Node.js 中的 WebSocket 库通常提供了区分不同客户端的能力,你可以通过存储每个连接的 WebSocket 实例来实现从服务器向特定客户端发送消息。下面以 ws 这个流行的 WebSocket 库为例,展示如何实现这一功能。

示例代码

首先,安装 ws 库:

npm install ws

然后,创建一个简单的 WebSocket 服务器,并保存所有客户端的 WebSocket 实例:

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

// 存储客户端WebSocket实例的对象
const clients = {};

wss.on('connection', (ws) => {
    console.log('New client connected!');

    // 为新的客户端生成一个唯一ID,并将其添加到clients对象中
    const clientId = generateUniqueId();
    clients[clientId] = ws;

    ws.on('close', () => {
        console.log(`Client ${clientId} disconnected.`);
        delete clients[clientId];
    });

    ws.on('message', (message) => {
        console.log(`Received message => ${message} from client ${clientId}`);
        
        // 假设消息格式是 "SEND_TO:clientB MESSAGE:messageContent"
        const [action, targetClientId, messageContent] = message.split(':');
        
        if (action === 'SEND_TO' && clients[targetClientId]) {
            clients[targetClientId].send(messageContent);
        }
    });
});

function generateUniqueId() {
    return Math.random().toString(36).substr(2, 9);
}

console.log('WebSocket server is running on ws://localhost:8080');

在这个例子中,当客户端A发送一个消息给服务器,格式为 "SEND_TO:clientB:messageContent",服务器将解析这条消息并找到客户端B的WebSocket实例,然后调用 .send() 方法发送消息。

关键点解释

  • clients 对象:用于存储每个连接的 WebSocket 实例。
  • generateUniqueId 函数:用于生成客户端的唯一标识符。
  • 处理消息:通过解析客户端发送的消息,确定目标客户端ID,并使用其WebSocket实例发送消息。

这种方法使得服务器能够灵活地向特定客户端发送消息。

回到顶部