写我自己琐碎的Bayeux客户端

时间:2016-02-12 11:16:31

标签: java bayeux

我正在尝试了解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();
            }

        }
    });
}

1 个答案:

答案 0 :(得分:1)

您的代码不正确。

/meta/connect频道上的消息没有subscription字段。

必须在/meta/subscribe频道上发送订阅。

您想要了解Bayeux Specification以获取更多详细信息,尤其是meta messages sectionevent messages section

建议launch the CometD Demo并查看客户交换的消息,并模仿实施中的消息。