如何在使用kdb+作为客户端连接到websocket后向服务器发送消息;Q

如何在使用kdb+作为客户端连接到websocket后向服务器发送消息;Q,websocket,kdb,q,Websocket,Kdb,Q,我正在q中构建一个websocket客户端,目的是连接到加密货币交易所以接收json格式的公共市场数据源,以便解析为kdb。在这一点上,使用,我已经通过使用stunnel创建了从我的q进程到Kraken exchange的持久websocket连接,并通过成功的连接/升级响应进行了验证。我的q脚本只定义了.z.ws来显示传入的消息,然后连接到运行stunnel的本地端口 .z.ws:{0N!.j.k(x);} h:(`:ws://127.0.0.1:5103)"GET / HTTP/

我正在q中构建一个websocket客户端,目的是连接到加密货币交易所以接收json格式的公共市场数据源,以便解析为kdb。在这一点上,使用,我已经通过使用stunnel创建了从我的q进程到Kraken exchange的持久websocket连接,并通过成功的连接/升级响应进行了验证。我的q脚本只定义了.z.ws来显示传入的消息,然后连接到运行stunnel的本地端口

.z.ws:{0N!.j.k(x);}

h:(`:ws://127.0.0.1:5103)"GET / HTTP/1.1\r\nHost: ws.kraken.com\r\n\r\n" 
我的stunnel配置如下所示:

(6i ;"HTTP/1.1 101 Switching Protocols\r\nDate: Mon, 08 Feb 2021 22:52:53 GMT\r\nConnection: upgrade\r\nSet-Cookie: __cfduid=d8179f7ef5db4e4e7a164dd75a492c2141612824773; expires=Wed, 10-Mar-21 22:52:53 GMT; path=/; domain=.kraken.com;HttpOnly; SameSite=Lax\r\nUpgrade: websocket\r\nSec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=\r\nuWebSockets:17\r\nCF-Cache-Status: DYNAMIC\r\ncf-request-id: 082..)
{"event": "ping"}

So you'd need to send something like this:

q).j.j(1#`event)!1#`ping
"{\"event\":\"ping\"}"
[海怪]
客户=是
sni=ws.kraken.com
接受=127.0.0.1:5103
connect=104.16.212.191:443

这一切似乎都起作用了,因为如前所述,MyQ进程收到了以下成功的系统状态确认

`connectionID`event`status`version!(9.223372e+18;"systemStatus";"online";"1.7.2")
指南说“如果成功,它将返回一个2项列表(句柄;HTTP响应)”,我也收到了。它们看起来像这样:

(6i ;"HTTP/1.1 101 Switching Protocols\r\nDate: Mon, 08 Feb 2021 22:52:53 GMT\r\nConnection: upgrade\r\nSet-Cookie: __cfduid=d8179f7ef5db4e4e7a164dd75a492c2141612824773; expires=Wed, 10-Mar-21 22:52:53 GMT; path=/; domain=.kraken.com;HttpOnly; SameSite=Lax\r\nUpgrade: websocket\r\nSec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=\r\nuWebSockets:17\r\nCF-Cache-Status: DYNAMIC\r\ncf-request-id: 082..)
{"event": "ping"}

So you'd need to send something like this:

q).j.j(1#`event)!1#`ping
"{\"event\":\"ping\"}"
我真的认为这将是艰难的一部分,我对迄今为止的成功感到有些自豪,但现在我发现自己又陷入了困境

现在如何与websocket交互?我想发送更多消息,如订阅/取消订阅特定端点?

上面引用的指南非常清楚地说:“要发送信息,请使用

q)neg[handle]"text" / a char vector"
但每当我尝试

q)neg[6i].j.j(`ping)
我得到以下错误

'Cannot write to handle 6. OS reports: Bad file descriptor 
我怀疑我可能需要在最初的GET请求中以某种方式订阅某些端点,但在连接到websocket之后,我仍然希望能够从不同的端点自由订阅和取消订阅

感谢您的阅读,非常感谢您的见解。这是我第一次在stackoverflow上发表文章

致以最良好的祝愿,
Ross

该错误可能与您的消息被拒绝有关。我快速查看了python示例,它似乎期望json如下所示:

(6i ;"HTTP/1.1 101 Switching Protocols\r\nDate: Mon, 08 Feb 2021 22:52:53 GMT\r\nConnection: upgrade\r\nSet-Cookie: __cfduid=d8179f7ef5db4e4e7a164dd75a492c2141612824773; expires=Wed, 10-Mar-21 22:52:53 GMT; path=/; domain=.kraken.com;HttpOnly; SameSite=Lax\r\nUpgrade: websocket\r\nSec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=\r\nuWebSockets:17\r\nCF-Cache-Status: DYNAMIC\r\ncf-request-id: 082..)
{"event": "ping"}

So you'd need to send something like this:

q).j.j(1#`event)!1#`ping
"{\"event\":\"ping\"}"

Aqua Q为其TorQ kdb框架提供了一个加密插件,该插件可能非常有用:


(免责声明,我为Aqua Q工作)

有趣的是,我发现,如果我将订阅消息作为原始脚本的一部分发送,则不会发生错误。当我连接到套接字后尝试在q中订阅时,仍然会出现错误。谢谢Matt!这非常有帮助,肯定帮助我弥合了kraken文献和我的q过程之间的鸿沟。我通过在我最初的web socket客户端连接脚本中发送消息,我能够让它按预期工作,但我仍然不确定在websocket连接建立后如何执行,因为同样的错误也会发生。我怀疑这与我的stunnel设置有关,但实际上并不是什么大问题,因为我我已经成功地编写了我想做的事情。另外,感谢大家对tor-q的了解。我正在研究它。