我正在尝试理解贝叶协议。我还没有找到一个网络资源来详细解释贝叶客户端在技术上是如何工作的。
从这个资源,
贝叶协议要求新客户端发送的第一条消息是握手消息(在/meta/handshake 频道上发送的消息(。
客户端处理握手回复,如果成功,启动 - 在幕后 - 与服务器的心跳机制,由交换连接消息(在/meta/connect 上发送的消息通道(。
此检测信号机制的详细信息取决于客户端使用传输,但可以看作是客户端发送连接消息并期待一段时间后的回复。
连接消息继续在客户端和服务器之间流动,直到任何一方决定通过发送断开连接消息(a在/meta/断开连接通道上发送的消息(。
我用Java方法编写了首先握手,然后订阅特定频道的方法。我利用Apache HttpClient库来执行HTTP POST请求。
现在是连接的部分。
我的理解是,我需要保持对贝叶服务器的请求打开,每当我收到响应时,都会发出另一个请求。
我写了下面的代码。我的理解是否正确,此贝叶客户端是否表现出正确的连接功能?(请忽略缺失的断线、退订方式(
另外,我已经针对贝叶服务器测试了代码,它可以正常工作。
/* clientId - Unique clientId returned by bayeux server during handshake
responseHandler - see interface below */
private static void connect(String clientId, ResponseHandler responseHandler)
throws ClientProtocolException, UnsupportedEncodingException, IOException {
String message = "[{"channel":"/meta/connect","
+ ""clientId":"" + clientId + ""}]";
CloseableHttpClient httpClient = HttpClients.createDefault();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (!doDisconnect) {
try {
CloseableHttpResponse response = HttpPostHelper.postToURL(ConfigurationMock.urlRealTime,
message, httpClient, ConfigurationMock.getAuthorizationHeader());
responseHandler.handleResponse(response);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
httpClient.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
t.start();
}
/*Simple interface to define what happens with the response when it arrives*/
private interface ResponseHandler {
void handleResponse(CloseableHttpResponse httpResponse);
}
public static void main(String[] args) throws Exception{
String globalClientId = doHandShake(); //assume this method exists
subscribe(globalClientId,"/measurements/10500"); //assume this method exists
connect(globalClientId, new ResponseHandler() {
@Override
public void handleResponse(CloseableHttpResponse httpResponse) {
try {
System.out.println(HttpPostHelper.toStringResponse(httpResponse));
} catch (ParseException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
你的代码不正确。
/meta/connect
通道上的消息没有subscription
字段。
订阅必须在/meta/subscribe
通道上发送。
您想研究贝叶规范以获取更多详细信息,特别是元消息部分和事件消息部分。
建议启动 CometD 演示并查看客户端交换的消息,并在实现中模拟这些消息。