Написание собственного тривиального клиента Байе

Я пытаюсь понять протокол Байе. Я не нашел веб-ресурса, подробно объясняющего, как технически будет работать клиент bayeux.

С этого ресурса

Протокол Байе требует, чтобы первое сообщение, отправляемое новым клиентом, было сообщением о рукопожатии (сообщение, отправленное по каналу /meta/handshake).

Клиент обрабатывает ответ на рукопожатие и, если он успешен, запускает - под прикрытием - механизм биения с сервером, обмениваясь сообщениями о соединении (сообщения, отправленные по каналу /meta/connect).

Детали этого механизма пульса зависят от используемого транспорта клиента, но могут рассматриваться как клиент, отправляющий сообщение о соединении и ожидающий ответа через некоторое время.

Сообщения о соединении продолжают передаваться между клиентом и сервером до тех пор, пока одна из сторон не решит отключиться, отправив сообщение о разъединении (сообщение, отправленное по каналу /meta/disconnect).

Я написал в методах Java, чтобы сначала сделать рукопожатие, а затем подписаться на определенный канал. Я использовал библиотеку Apache HttpClient для выполнения запросов HTTP POST.

Теперь приходит часть подключения.

Насколько я понимаю, мне нужно держать запрос открытым для сервера bayeux и всякий раз, когда я получаю ответ, делаю еще один запрос.

Я написал код ниже. Правильно ли мое понимание и этот клиент 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 ответ

Решение

Ваш код неверен.

Сообщения на /meta/connect канал не имеет subscription поле.

Подписки должны быть отправлены на /meta/subscribe канал.

Вы хотите изучить спецификацию Bayeux для получения более подробной информации, в частности, раздела мета-сообщений и раздела сообщений о событиях.

Предлагаем запустить демонстрацию CometD и посмотреть на сообщения, которыми обменивается клиент, и повторить их в вашей реализации.

Другие вопросы по тегам