【问题标题】:How to publish private information via public websock channel?如何通过公共 websocket 通道发布私人信息?
【发布时间】:2020-01-06 00:52:11
【问题描述】:

给定一个 URL,例如:'http://my-site.com/my_ws',我想发送两种类型的消息:

  1. 公共消息,和广播一样,所有连接到websocket的人都会收到。例如当前市场价格。

  2. 私人消息,只有 1 人会收到,例如当前用户的余额。

我知道很多交易所都实现了这个,有人可以给我一个线索吗?

---------------------- 来源问题如下:

今天我发现了一个非常有趣的网站,它通过 websocket API 发送个人信息,看起来像是一个公共频道。

我的问题是:如何做到这一点? websocket服务器可以通过某种秘密方法发送私人信息吗? 下面是 websocket 通道的详细信息:

一般:

Request URL: wss://wbs.mxc.com/socket.io/?EIO=3&transport=websocket
Request Method: GET
Status Code: 101 Switching Protocols

响应头:

HTTP/1.1 101 Switching Protocols
Date: Tue, 03 Sep 2019 06:13:55 GMT
Connection: upgrade
Server: nginx
upgrade: websocket
sec-websocket-accept: xr3/mMY887Utp3cnZdf37ycDWAc=
sec-websocket-extensions: permessage-deflate

请求头:

GET wss://wbs.mxc.com/socket.io/?EIO=3&transport=websocket HTTP/1.1
Host: wbs.mxc.com
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: https://www.mxc.com
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7
Sec-WebSocket-Key: oYmhqikSoGD8AgdqrMj0XQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

这是一个关于加密货币交换的网站。

客户端用户可以收到公开信息(加密价格...等),登录用户可以通过相同的 URL 收到他的帐户余额。

那该怎么做呢?

我在其他一些网站上也看到过这种东西,比如 huobi.pro,(EIO=3...) 这是一种 websocket 客户端框架吗?

非常感谢

【问题讨论】:

  • 为什么不能使用cookies?
  • 你当前的 WebSocket 是用什么语言和框架编写的?
  • 我猜你在找这个? stackoverflow.com/questions/23619015/…
  • @MichaelWarner 我正在使用 Ruby 和 Rails。

标签: websocket


【解决方案1】:

首先,重要的是要了解 WebSocket 连接不是广播。
情况恰恰相反:从技术上讲,每个正在连接的客户端从一开始就拥有自己的(私有)WebSocket 连接到服务器,而服务器端又通过唯一的连接 ID 引用该连接。

考虑到这一点,剩下的就很容易解释了:服务器现在可以使用通常的方法来进一步识别客户端。在这样的市场上,这通常只需通过登录即可发生。之后,服务器知道具有您唯一 ID 的 WebSocket 连接属于您的特定用户帐户。从此时起,它不仅会开始将“公共”信息推送到您的 WebSocket 连接,还会开始推送仅供您帐户使用的私人信息。

对此有一些框架,但只发送两种类型的消息,一种用于所有用户,一种用于特定用户,您可能不需要一种或至少不需要非常复杂的一种。
但是,实际上很受欢迎并且在这里也很适合的匹配是socket.io。 socket.io 为您提供了一个方便的 API 来使用 WebSockets 并启用私人消息以及 智能 广播。为了说明这一点,请考虑以下伪代码:

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

io.on('connection', (socket) => {

    // Already at this point you can reference the unique connected client by socket.id
    // However, currently we are not interested in the unique client 
    // and just want to send 'public' information to everybody:
    socket.emit('Pubic message everybody will get');

    socket.on('login', loginData => {
        // Obviously you would authenticate against a database and a lot more sophisticated ;-)
        if (loginData.name === "Rose" && loginData.pass === "superStrongPassword") {
            socket.emit('Hello Rose, this is your private message');

            // And since you are now logged in maybe also check for something in any kind
            // of DB collection and lets inform you whenever there is an update
            OrdersCollection.find({'owner':'Rose'}).observe({
                changed: updatedOrder => {
                    socket.emit('One of your orders you placed with us was just updated. Here is the current order:', updatedOrder);
                }
            })
        }
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2012-08-03
    • 1970-01-01
    相关资源
    最近更新 更多