首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过网络公开渠道发布私人信息?

如何通过网络公开渠道发布私人信息?
EN

Stack Overflow用户
提问于 2019-09-03 06:36:04
回答 1查看 182关注 0票数 0

给定一个诸如:'ws‘这样的URL,我想发送两种类型的消息:

  1. 公众信息,就像广播一样,所有连接到websocket的人都会收到。目前的市场价格。
  2. 私人消息,只有一个人将收到,例如当前用户的余额。

我知道很多交易所都是这样做的,有人能给我一个线索吗?

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

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

以下是websocket频道的详细信息:

一般情况:

代码语言:javascript
运行
复制
Request URL: wss://wbs.mxc.com/socket.io/?EIO=3&transport=websocket
Request Method: GET
Status Code: 101 Switching Protocols

响应头:

代码语言:javascript
运行
复制
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

请求头:

代码语言:javascript
运行
复制
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

这是一个关于密码交换的网站。

客户端用户可以接收公共信息(密码价格...etc),登录用户可以通过相同的URL接收他的帐户余额。

那怎么做呢?

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

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-07 02:13:08

首先,重要的是要理解WebSocket连接不是一个愚蠢的广播。

恰恰相反:从技术上讲,每个连接客户端从一开始就获得到服务器的(私有) WebSocket连接,而服务器端则使用唯一的连接id引用服务器端。

记住这一点,其余的都很容易解释:服务器现在可以使用通常的方法来进一步识别客户端。在这样一个市场上,这通常只会发生在登录。之后,服务器知道具有唯一ID的WebSocket连接属于您的特定用户帐户。从现在开始,它将开始不仅将“公共”信息推送到您的WebSocket连接,而且还会将仅用于您帐户的私有信息推送到您的帐户中。

有这样的框架,但是只发送两种类型的消息,一种是针对所有用户,另一种是针对特定用户,您可能不需要一种,或者至少不是非常复杂的一种。

然而,实际上非常流行的是socket.io,这也是一个很好的匹配。socket.io为您提供了一个方便的API来使用WebSockets,并支持私有消息和智能广播。为了说明这一点,请考虑以下伪代码:

代码语言:javascript
运行
复制
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);
                }
            })
        }
    });
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57766181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档