【问题标题】:websockets - get message from a websocket server and send it to clientwebsockets - 从 websocket 服务器获取消息并将其发送到客户端
【发布时间】:2018-11-10 02:52:55
【问题描述】:

我正在尝试学习 websocket 的工作原理。我能够从 websocket 服务器获取交易数据并将其打印在控制台上。但是,我试图了解如何将该消息传递到我的 websocket 服务器,以便我可以将它发送到我的 websocket 客户端。基本上,我想在浏览器上打印每条消息。

"use strict";

const WebSocket = require("ws");

const binanceWS = new WebSocket("wss://stream.binance.com:9443/ws/stratbtc@trade");

binanceWS.on("open", function open() {
    console.log("open action");
});

binanceWS.on("message", function incoming(data) {
    console.log(data);
});

现在这个binanceWS 将在收到数据时打印数据。我想做的是如何传递给我的 WebSocket.Server 对象的send eventlistener。正如您在https://github.com/websockets/ws 中看到的一个示例,当有连接时,wss 本身会获取一个 websocket 对象。

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

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

  ws.send('something');
});

谢谢!

注意:我说的结构是这样的。基本上,我会让 websocket 消费者获取交易数据。在同一主机(现在是本地主机)内将有一个 websocket 服务器。这个 websocket 服务器会向每个客户端 websockets 发送数据。

成功: 好的,我通过在 websocket 服务器连接中定义消费者 websocket (binanceWS) message 侦听器来做到这一点。我不确定这是否是一个好方法

"use strict";

const WebSocket = require("ws");

const binanceWS = new WebSocket("wss://stream.binance.com:9443/ws/stratbtc@trade");

binanceWS.on("open", function open() {
    console.log("open action");
});

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

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

  binanceWS.on("message", function incoming(data) {
      ws.send(data);
  });
});

【问题讨论】:

    标签: javascript node.js websocket


    【解决方案1】:

    单个 websocket

    //websocket connection event will return a socket you can later use
    binanceWS.on("connection", function(socket) {
        socket.on("message", function incoming(data) {
        console.log(data);
        // if you want to send that message back to the client who sent it, 
        // you can use send method on the socket
         socket.send(data)
        });
    });
    

    嵌套 websocket

    //websocket connection event will return a socket you can later use
    binanceWS.on("connection", function(socket) {
        // create another websocket here
        const wss = new WebSocket.Server({ port: 8080 });
    
        // connect the second websocket
         wss.on("connection", function(ws) {
          // start listening to first websocket incoming messages 
          // if second communication has successully been instantiated 
          socket.on("message", function incoming(data) {
          // send the data using the second websocket
          ws.send(data)
          })
        });
    });
    

    那么你需要在你的客户端有这个最少的代码,你会看到服务器和你的客户端之间的交互

    客户

    const socket = new WebSocket('server_url'); // Connection opened 
    socket.addEventListener('message', function (event) { socket.send('send message'); });
    

    注意:由于你会将一个 websocket 的传入数据用到另一个 websocket 中,所以最好只有在第一个 websocket 成功打开的情况下再打开第二个 websocket

    【讨论】:

    • 如果我错了,请纠正我。在这里,您期望客户端 websocket 连接到 binanceWS。建立连接后,客户端 websocket 可以向 binanceWS 发送消息,而 binanceWS 会发回该消息?
    • 是的,就是这样!
    • 感谢您的回复,但我有点困惑。我正在尝试在触发binanceWS.on('message') 时发送数据。为此,我需要创建一个新的 WebSocket.Server 并使用该 websocket 服务器对象发送消息
    • 其实我的这段代码会在message事件被触发时将数据发送回客户端。这意味着在你的客户端上,你应该有这样的东西:const socket = new WebSocket('server_url'); socket.addEventListener('message', function (event) { socket.send('send message'); });我会更新我的答案
    • 嘿 edkeveked 我用我想要完成的小结构更新了我的帖子。基于我的结构 binanceWS 从交换获取数据的消费者 websocket。然后我需要创建一个 websocket 服务器,它将我从 binanceWS 获取的数据发送到客户端 websockets。清楚吗?谢谢!
    【解决方案2】:

    我通过为 websocket 客户端保存一个全局列表来实现这一点。而当consumer websocket消息事件触发时,会通过遍历list的方式发送给每一个client。

    "use strict";
    
    const WebSocket = require("ws");
    
    const binanceWS = new WebSocket("wss://stream.binance.com:9443/ws/eosbtc@trade");
    
    var websocketList = [];
    
    binanceWS.on("open", function open() {
        console.log("open action");
    });
    
    binanceWS.on("message", function incoming(data) {
        console.log(data);
    
        // send data to every websocket client
        websocketList.forEach(ws => {
            ws.send(data);
        });
    });
    
    const wss = new WebSocket.Server({ port: 8080 });
    
    wss.on("connection", function connection(ws) {
    
        // add ws handle to websocket list.
        websocketList.push(ws);
    
        ws.on("close", function close() {
            console.log("Disconnected");
        });
    });
    

    【讨论】:

    • 能否请您发布您的客户端?我想了解如何在客户端检索 websocketList 中的项目?
    • 有点晚了,但是...根据文档 (github.com/websockets/ws#server-broadcast),您应该不需要保留客户端列表,您应该在 wss 中拥有已连接客户端的列表,您可以在可以用来循环。
    猜你喜欢
    • 2017-09-15
    • 2020-09-06
    • 2022-07-15
    • 1970-01-01
    • 2018-10-25
    • 2023-03-07
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多