【问题标题】:How to use the client ID in HTML5 websocket and node.js chat?如何在 HTML5 websocket 和 node.js 聊天中使用客户端 ID?
【发布时间】:2018-03-16 00:45:26
【问题描述】:

我正在尝试在使用 HTML5 websocket 和 node.js 创建的简单聊天中在用户之间发送私人消息。

当用户连接时,我为他们创建一个简单的 ID(连接 ID)并将其添加到此 CLIENTS=[];

当我执行console.log(CLIENTS); 时,我看到的所有 ID 都是这样的:

[0, 1, 2]

现在我需要使用 ID 向用户发送私人消息。

所以我继续这样做(出于测试目的,我只需要将消息发送给 ID 为 2 的用户)

var express = require('express'),
        app = express(),
        http = require('http').Server(app),
        WebSocketServer = require('ws').Server,
        wss = new WebSocketServer({
            port: 8080
        });

    CLIENTS = [];
    connectionIDCounter = 0;


    app.use(express.static('public'));

    app.get('/', function(req, res) {
        res.sendFile(__dirname + '/index.html');
    });

    wss.broadcast = function broadcast(data) {
        wss.clients.forEach(function each(client) {
            client.send(data);
        });
    };

    wss.on('connection', function(ws) {

    /////////SEE THE IDs HERE////////////////

    ws.id = connectionIDCounter++;
    CLIENTS.push(ws.id);
    console.log(CLIENTS);


        ws.on('message', function(msg) {
            data = JSON.parse(msg);


    /////SEND A PRIVATE MESSAGE TO USER WITH THE ID 2//////

    CLIENTS['2'].send(data.message);

    });

});

http.listen(3000, function() {
    console.log('listening on *:3000');
});

当我运行我的代码时,我收到以下错误:

TypeError: CLIENTS.2.send is not a function

有人可以就这个问题提出建议吗?

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • CLIENTS = [] => CLIENTS = {}, CLIENTS.push(ws.id); => CLIENTS[ws.id] = ws。基本上,您保存的是客户端 ID,而不是客户端连接。
  • 这是什么意思:CLIENTS = [] => CLIENTS = {}, CLIENTS.push(ws.id); => 客户[ws.id] = ws ?
  • 用对象替换数组。保存整个 ws 连接,而不仅仅是 id。
  • 好吧..我会试试的。

标签: node.js html websocket


【解决方案1】:
  1. 手动跟踪客户,替换: CLIENTS = []CLIENTS = {}CLIENTS.push(ws.id);CLIENTS[ws.id] = ws;

  2. 根据码头https://github.com/websockets/ws/blob/master/doc/ws.md 应该是这样的:

new WebSocket.Server(options[, callback])
clientTracking {Boolean} 指定是否跟踪客户端。

server.clients - 存储所有已连接客户端的集合。请注意 仅当 clientTracking 为真时才添加此属性。

    var WebSocketServer = require('ws').Server,
        wss = new WebSocketServer({
                port: 8080,
                clientTracking: true
        });

    .....

    wss.on('connection', function(ws) {
       ws.on('message', function(msg) {
          data = JSON.parse(msg);
          wss.clients[ID].send(data.message);
       });
   });

我不知道wss.clients是什么数据格式,你自己试试吧。如果这真的是码头所说的{Set},那么试试wss.clients.get(ID).send(data.message)

【讨论】:

  • 不是wss.clients[ID].send(data.message); 应该是wss.CLIENTS[ID].send(data.message); 吗?
猜你喜欢
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2011-01-04
  • 1970-01-01
相关资源
最近更新 更多