我正在尝试了解Bayeux协议。我还没有找到一个网络资源,详细说明了拜耳客户在技术上的工作方式。
来自this资源,
Bayeux协议要求新客户端发送第一条消息 是一个握手消息(在/ meta / handshake信道上发送的消息)。
客户端处理握手回复,如果成功, 开始 - 在幕后 - 与服务器的心跳机制,由 交换连接消息(在/ meta / connect上发送的消息 渠道)。
此心跳机制的详细信息取决于客户端 使用的传输,但可以看作是发送连接的客户端 消息,并希望在一段时间后回复。
连接消息继续在客户端和服务器之间流动,直到 任何一方决定通过发送断开连接消息来断开连接(a 在/ meta / disconnect信道上发送的消息。)
我已经用Java方法编写了第一次握手,然后订阅了一个特定的通道。我利用Apache HttpClient库来执行HTTP POST请求。
现在是连接的一部分。
我的理解是,我需要向Bayeux服务器保持一个请求,每当我收到回复时,都要提出另一个请求。
我写了下面的代码。我的理解是否正确,这个拜耳客户端是否展示了正确的连接功能? (请忽略缺失的断开连接,取消订阅方法)
另外,我已经针对Bayeux服务器测试了代码,它运行正常。
/* 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();
}
}
});
}
答案 0 :(得分:1)
您的代码不正确。
/meta/connect
频道上的消息没有subscription
字段。
必须在/meta/subscribe
频道上发送订阅。
您想要了解Bayeux Specification以获取更多详细信息,尤其是meta messages section和event messages section。
建议launch the CometD Demo并查看客户交换的消息,并模仿实施中的消息。