0

Bayeux プロトコルを理解しようとしています。bayeux クライアントが技術的にどのように機能するかを詳細に説明している Web リソースは見つかりませんでした。

このリソースから、

Bayeux プロトコルでは、新しいクライアントが送信する最初のメッセージがハンドシェイク メッセージ (/meta/handshake チャネルで送信されるメッセージ) である必要があります。

クライアントはハンドシェイク応答を処理し、それが成功した場合は、接続メッセージ (/meta/connect チャネルで送信されるメッセージ) を交換することにより、サーバーとのハートビート メカニズムを内部で開始します。

このハートビート メカニズムの詳細は、使用されるクライアント トランスポートによって異なりますが、クライアントが接続メッセージを送信し、しばらくしてから応答を期待しているように見えます。

接続メッセージは、いずれかの側が切断メッセージ (/meta/disconnect チャネルで送信されるメッセージ) を送信して切断することを決定するまで、クライアントとサーバーの間を流れ続けます。

最初にハンドシェイクを行い、次に特定のチャネルをサブスクライブする Java メソッドを記述しました。HTTP POST リクエストを実行するために、Apache HttpClient ライブラリを利用しました。

次に接続の部分です。

私の理解では、バイユーサーバーに対してリクエストを開いたままにし、応答を受け取るたびに別のリクエストを行う必要があるということです。

私は以下のコードを書いています。私の理解は正しいですか?このバイユー クライアントは正しい接続機能を示しますか? (欠落している切断、登録解除メソッドは無視してください)

また、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();
            }
            
        }
    });
}
4

1 に答える 1

1

あなたのコードは正しくありません。

チャネルのメッセージに/meta/connectはフィールドがありませんsubscription

サブスクリプションはチャンネルで送信する必要があり/meta/subscribeます。

詳細については、 Bayeux 仕様、特にメタ メッセージ セクションイベント メッセージ セクションを調べたいと考えています。

提案は、CometD デモを起動し、クライアントによって交換されたメッセージを見て、実装でそれらを模倣することです。

于 2016-02-12T13:59:48.083 に答える