Написание собственного тривиального клиента Байе
Я пытаюсь понять протокол Байе. Я не нашел веб-ресурса, подробно объясняющего, как технически будет работать клиент 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 и посмотреть на сообщения, которыми обменивается клиент, и повторить их в вашей реализации.