KDB/Q Websocket示例,获取`badmsg-error:如何在将数据发送到KDB服务器时序列化数据



最近,我一直在尝试将数据从KDB流式传输到python。我现在正在使用websocket,并且已经浏览了文档https://code.kx.com/q/wp/kdb_and_websockets.pdf

在python方面,我一直在尝试ws4py、autobahn和websocket客户端。

所有这些都做得很好,本质上我的问题在于发送到服务器以订阅提要的消息的格式。

一个小的(开源(例子:

class DummyClient(WebSocketClient):
def opened(self):
self.send(*what should I put here?*, binary=True)
def closed(self, code, reason=None):
print("Closed down", code, reason)
def received_message(self, m):
# not yet implemented
if __name__ == '__main__':
try:
ws = DummyClient('ws://host:port/', protocols=['http-only', 'chat'])
ws.connect()
ws.run_forever()
except KeyboardInterrupt:
ws.close()

打开时,我应该通过调用服务器函数loadPage来订阅提要。当对包含函数名和参数的列表进行编码时,我尝试了不同的方法,但都没有成功。

我尝试过的:

np.array("['loadPage',[]]"(.tobytes((

"['loadPage',[]]".encode('utf8'(

json格式化

十六进制格式化

任何帮助都将不胜感激!

最佳,Yael

我认为在这种情况下,您需要做的是在您的kdb服务器中定义.z.ws。这个函数将被调用,无论你通过websocket传递什么作为参数,所以例如,如果你像这样定义.z.ws

.z.ws:{show x}

然后通过WebSocket发送一条消息,如下所示:

var ws = new WebSocket("ws://localhost:1234")
ws.send("Hello World")

这将在您的kdb会话中输出,例如

λ q
KDB+ 3.6 2018.06.14 Copyright (C) 1993-2018 Kx Systems
w64/ 4(16)core 8082MB jonat laptop-o8a8co1o 10.255.252.249 EXPIRE 2019.05.21 jonathon.mcmurray@aquaq.co.uk KOD #4160315
q).z.ws:{show x}
q)p 1234
q)"Hello World"

因此,在您的情况下,如果您想调用loadPage,那么定义.z.ws可能很简单,如下所示:

.z.ws:loadPage

然后,通过套接字传递的任何内容都将传递到loadPage中(请注意,如果您在其他地方更改loadPage,这将不会更新,如果您需要能够动态更新,则可以使用.z.ws:{loadPage x}(。对于幂零函数,这将忽略中传递的任何内容

最新更新