我正在尝试为Matlab构建一个lightstreamer客户端。确实存在一些用于JAVA、Python、.Net等平台的库,但不幸的是,没有Matlab。然而,事实证明,这些客户端实现中的大多数对lightstreamer使用了完全相同的文本模式协议,这是非常基本的HTTP请求。
我想好了如何建立/关闭一个lightstreamer会话。我得到sessionId,我可以使用这个id订阅我想要流式传输的数据。但是,尽管我确实收到了订阅呼叫的有效响应,但没有推送数据。
我使用urlead2函数,响应似乎很好:
[output,extras] = urlread2([lightstream_url,'/lightstreamer/control.txt'],'POST',body,headers);
allHeaders=
Response: {'HTTP/1.1 200 OK'}
Server: {'Lightstreamer'}
Content_Type: {'text/plain; charset=iso-8859-1'}
Cache_Control: {'no-store' 'no-cache'}
Pragma: {'no-cache'}
Expires: {'Thu, 1 Jan 1970 00:00:00 GMT'}
Date: {'Wed, 8 Apr 2015 11:15:02 GMT'}
Content_Length: {'4'}
status=
value: 200
msg: 'OK'
isGood=
1
输出=
OK
响应主体包含"OK"是正确的,这是有文档记录的(文档,第20ff页),但也应该有流数据本身,不是吗?
那么我该如何获得实际数据呢?
在代码中的某个位置,您应该有一个create_session.txt/bind_session.txt请求,否则您不应该有从control.txt请求中获得OK答案所需的有效会话id(例如,以下生成SYNC ERROR,这意味着服务器无法识别指定的会话:http://push.lightstreamer.com/lightstreamer/control.txt?LS_op=add&LS_session=无效)
control.txt响应上没有接收到数据流,OK响应只是意味着"OK,我已经将订阅添加到您的会话中"。数据流是在create_session.txt/bind_session.txt响应中接收的。您链接的文档的第4.1节和第4.2节以及第4.5节应解释如何接收数据
我发现通过设置LS_polling=true
打开轮询连接可以很好地工作,而不需要listner。如果将LS_polling
保留为false
的默认值,则urlread2
将挂起。
- 使用
/lightstreamer/create_session.txt
创建会话 - 使用
/lightstreamer/control.txt
请求订阅 - 使用
反复轮询连接以获取数据/lightstreamer/bind_session.txt
urlread2
返回的内容如下:
d =
OK
SessionId:S9b09da8ebd6b835aT5316913
ControlAddress:apd119a.marketdatasystems.com
KeepaliveMillis:1000
MaxBandwidth:0.0
RequestLimit:50000
1,1|10162.00|0.00|0.00
2,2|10686.8|TRADEABLE|0.5524861
2,13|1202.6|CLOSED|0.5714285
2,14|5900.51|CLOSED|0.5714285
...
LOOP 1000