どのようにGrailsはのWebSocketをサポートしていますか?

ログの練習

  1. サーバーの開発

    1.1パッケージの導入

     	implementation "org.grails.plugins:grails-spring-websocket:2.5.0.RC1"
    

    1.2。方法にアノテーションで指定されたコントローラ、書き込み対象アドレスのアウトTODO] [
    1.3。オープン安全限界/ストンプ/ **の

  2. JSクライアントコード[TODO]を書きます

  3. 書くJavaクライアントコード[TODO]

WebSocketの概要

  • はじめに基本的な概念や技術の開発をwebsock、このブログでは、このようなデータフレーム、APIなどの技術的な詳細について説明します。

  • Grailsの有WebSocketのプラグイン

  • WebSocket プロトコルは、これはおそらく、再びそれを見る必要が

    • これは私の疑問を解決するために、「再接続」に記載されています。7.2.3を参照してください。異常な閉鎖からの回復
      最初のWebSocket自体は、再接続時間間隔がDoS攻撃で、その結果、同じ時刻の再接続を避けるために非常に重要であり、再接続が自分を達成するために、クライアントによってなされなければならない、自動再接続のようなものではありません。戦略がランダムに到着した後、最初から時間間隔を2時間間隔として指数関数的に再試行の数に応じて選択され、上限は、最初の再接続をより0~5秒の間のランダムな時間を要します良いです。
  • 春用WebSocket の使用

  • WebSocket的Javaクライアントlibarary

    • vert.xのためのGroovyは、のWebSocketクライアントを達成するために使用することができます。しかし、全体のプログラミングモードは、私は春の実現を選んだので、アップ遅くに適応するように変更され、まだ家族です。春は本当に信頼できます[]

問題が発生しました

コードは複数のサンプルに応じて、書き込まれた後、以下のような種々の問題が発生し、最終的に一つ一つを解決しました。

java.lang.NoClassDefFoundErrorが:javaxの/のWebSocket / ClientEndpointConfig $コンフィギュレータStandardWebsocketClientから

またはTYROSは、ばねブートのWebSocket-スターターパックを追加する必要があります。
春・ブートのWebSocket-スターターパッケージの最終的な選択。

サーバーからのHTTPレスポンス[200]はHTTPのWebSocketへのアップグレードを許可しませんでした

org.glassfish.tyrus.core.HandshakeException:200:レスポンスコードが101ではなかったです。

SockJSClientプラスのWebSocketへの切り替えは、交通を解決しました。

対象は、サブスクリプションによって送信されたメッセージを受信できません

あなたは、サーバーに送信することができますが、メッセージサーバを受け取ることができません。
元はJackson2MessageConverterは、Content-Typeで、そのサーバーによって返さMIMIEメッセージヘッダをサポートしていないです。

contentType -> {MimeType@2934} "text/plain;charset=UTF-8"

これは、プロセスを行く前に、アプリケーション/ jsonのそれでなければなりません。私たちは、このMIMEタイプ語っコンバータのサポートを強制する必要があります。

// 让 converter 支持 text/plain MIME 类型,否则 handler 收不到通知
stompClient.setMessageConverter(new MappingJackson2MessageConverter(
        new MimeType("application", "json"),
        new MimeType("text", "plain")));

CONNECTメッセージは、200と101のリターンの違いを知ってもらう必要があります

StandardWebSocketClientは、クライアントクラスのサーバーに直接接続を開始し、関数の結果を接続すると、エラーが報告されます。

The HTTP response from the server [200] did not permit the HTTP upgrade to WebSocket

これは最終的に何を意味するかしていますか?それは本当へのTCP接続を確立していない場合は、この例外がスローされますか?またはのWebSocket自体は、追加の新しいTCP接続を作成しないのですか?

WebSocketの基本的な原理は次のとおりです。

接続確立フェーズで、あるいはTCP / IP接続を確立し、元のリンク上のHTTPプロトコル、および全二重通信のために使用用WebSocketプロトコルを廃棄するHTTPプロトコルポートを使用。だからのWebSocket接続HTTPとは異なる(ワイヤフォーマット)以外長いHTTP接続のようなHTTP接続、通信プロトコルに相当する事実です。

結論はつまり、WebSocketのは、追加のTCP接続を確立しません、とのWebSocketリンクとしてリンクHTTPリクエストとの接続を開始します。

接続の確立には、サーバは、Grailsのような衝撃の明細書のように、101よりもむしろ200ステータスコードを返します。

The handshake from the server is much simpler than the client
handshake.  The first line is an HTTP Status-Line, with the status
code 101:

     HTTP/1.1 101 Switching Protocols

Any status code other than 101 indicates that the WebSocket handshake
has not completed and that the semantics of HTTP still apply.  The
headers follow the status code.

そのフォローアップも、代わりのWebSocketプロトコルのHTTPプロトコルを使用する必要があります。

SockJsと呼ばれるSpringWebSocket利用何かので、このSockJsの主な役割は、それが何のWebSocketのWebSocketインタフェースがサポートされているブラウザ上で動作していない、JSは、従来の技術およびHTTPリクエストを使用して達成するために与えることです。これらの技術は、WebSocketを、XHR / Ajaxの、IFRAMEのページを持っています。[せいに互換性のあるブラウザです]

SockJsClientコードを確認し、私はそれと関連InfoReceiverとRestTemplateXhrTransportを発見しました。

InfoReceiverはSockJSを実行するためにある情報を、そのようなサポート用WebSocketするかどうかなど、サーバのエンドポイントの能力を、理解するために、サーバーに照会し、コンポーネントを要求する契約。それSockJSを実現することもできるのWebSocketサーバ側が能力を提供していませんが、クライアントはまだアナログのWebSocketインタフェースを使用することができます。[複雑に従事し、世界のために別の成功した枠組みを感じ]

合意SockJSああを見てする必要があるように思われます。私がで見つかっここに

基本的な考え方は以下のとおりです。

  • サービス - サーバが複数のサービスを提供することができ、各サービスはBASE_URLを持っています。
  • ベースURLは - クライアントのURLアドレスに、と、できない「/」終わり、URLを要求した他のすべての派生の接頭辞でありますhttp://localhost:8000/echo
  • /情報 - (もちろん、ベースURLに基​​づいています)、このURLは、セッションの開始前に、クライアントがアクセスすることができます。ネットワークの往復時間(移動時間)を測定し、サーバーがサポート用WebSocketを照会するために使用します。
  • 直接アクセスSockJSのWebSocketサーバポートは失敗しなければなりません。はい、それはある[A]
  • トップセッションURL:/ <サーバー> / <セッション> - セッション(セッションが接続され)、常にクライアントによって開始されます。
  • プロトコルとフレーミング - プロトコルとフレーミング、SockJSのWebSocket APIのみと一致しますが、異なるネットワークレイヤプロトコル。
  • WebSocketのプロトコル:/ * / * /のWebSocket - SockJS最も重要な機能は、ネイティブのWebSocketプロトコルのサポートで、良いSockJSサーバーは、少なくとも4つのWebSocketプロトコルをサポートしなければならない、すなわちクロム、SafariとFirefoxの変異体です。

SockJS契約を読んだ後、ただのWebSocket APIを借りSockJSを理解し、ネリは拡大し、よりよく聞かせてブラウザの狙いと通信するための統一のWebSocket APIでサーバーを強化するために多くのことを行っています。

春のWebSocket仕様はのWebSocket APIですが、我々は、SockJSに仕様を使用して、実際には、春のWebSocketをだまされているように、SockJSに基づいています。

この問題への答えは(Grailsの-のWebSocket-プラグインが春のWebSocketに基づいて開発された)春のWebSocketサーバに例外レポートをネイティブのWebSocketプロトコルクライアント接続を使用することですので、正しい動作をSockJSによって定義されStandardWebSocketClientを終了します。

すべてが右であるように、我々は、アクセスSockJSサーバーにSockJSを使用する必要があります。
[SockJSのおかげで、非常に複雑な技術の世界を作るには、コーディネートのかすかされています]

参考資料

  1. Grailsの抗バネのWebSocket-docのプラグイン
  2. 春のWebSocketのサンプルプロジェクト
  3. WebSocketを-API-javaの-spring-クライアントクライアントの例
  4. WebSocketの代替実装sockjs春は、バックアップ計画のsockjs、良いを提供します。いいえ自動再接続SockJS機能があるので、この使用する必要があるsockjs再接続を行うこと。
  5. Grailsの春スケジューラの使用例
公開された46元の記事 ウォン称賛7 ビュー80000 +

おすすめ

転載: blog.csdn.net/yangbo_hr/article/details/104544608