节点Websockets广播无法正常工作

时间:2017-01-20 23:24:37

标签: node.js websocket

目前我的“广播”问题似乎没有通过超级简单的websocket设置正常运行,我开始在Node中。这是我第一次使用websockets,所以我可能会遗漏一些非常明显的东西,但在网上看了一段时间之后,我无法找到解决方案。

基本上我只是想把一些json推送到所有当前连接的客户端。

我可以确认该套接字是否正常工作,因为当我在ws:// localhost:3000连接时,我能够在'connection'块中的'ws.send'上看到静态连接字符串,以及看到多个套接字如果我连接多个客户端,客户端将从广播方法注销。

对于我可能遗失的任何帮助都将不胜感激,

var WebSocketServer = require('uws').Server;
var wss = new WebSocketServer({ port: 3000 }); // ws://localhost:3000

// Static test var
var test_message = {
    'test': 'Response',
    'test2': 'Response2'
};

// Broadcast to all.
wss.broadcast = function broadcast(data) {
  wss.clients.forEach(function each(client) {
    console.log('IT IS GETTING INSIDE CLIENTS');
    console.log(client);

    // The data is coming in correctly
    console.log(data);
    client.send(data);
  });
};

wss.on('connection', function(ws) {
   ws.on('message', function(message) {
     wss.broadcast(test_message);
     console.log('Received: ' + message);
   });

   // TODO This is static just to check that the connection is properly working
   ws.send('You successfully connected to the websocket.');
});

1 个答案:

答案 0 :(得分:2)

我使用Smart Websocket Client测试了您的代码。你的代码很好。如果您广播仅包含string的数据,则可以在用户界面中看到回复,但对于javascript object,虽然您可以看到响应为Binary Frames (opcode = 2),但客户端仍无法显示} Chrome Developer Tools

此行为背后的原因是ws.send()方法支持普通字符串,类型化数组或blob,但发送类型化数组和blob将导致客户端接收的帧作为二进制帧(opcode = 2)。

您可以尝试JSON.stringify object

wss.on('connection', function(ws) {
   ws.on('message', function(message) {
     wss.broadcast(JSON.stringify(test_message));
     console.log('Received: ' + message);
   });

   ws.send('You successfully connected to the websocket.');
});