問題タブ [jsr356]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 同じユーザーが再接続した場合の Java Websocket 接続チェック
私のアプリケーションには、接続されているすべてのセッションを接続時に保存し、適切に切断された場合は削除するセッションハンドラーがあります。そうでない場合はセッションを維持し、再接続した場合は古いセッションを新しいセッションに置き換えます。(以下のコードはばかげているように見えますが、私の主張を説明するためのものです)
問題は、セッションが以前に接続されたクライアント用であることを確認して、セッションを新しく開いたセッションに置き換えることができるかどうかです。
編集:私のクライアントは、ユーザーがページを更新/ナビゲートできる html5 アプリケーションであり、その後接続が失われるため、これが必要です。彼が再接続しようとするときはいつでも、彼が現在プレイしているゲームを知りたい. ユーザーが不安定な接続 (携帯電話など) を使用している場合、接続が時々失われます。
javascript - Base64 エンコード文字列の送信時に WebSocket が終了する
base64 でエンコードされた文字列 (画像から変換されたもの) を websocket 経由で送信しようとしていますが、これは JavaScript クライアントで正常に機能しています。
しかし、代わりに Java クライアント (@clientEndPoint) を使用すると、onMessage 関数が 1 回トリガーされ、websocket 接続がすぐに閉じられます。エラーなし。
繰り返しますが、サーバーからプレーン文字列を送信してみましたが、Java クライアントは適切に機能します。しかし、base64 でエンコードされた文字列ではそうではありません。
Tomcat 7.0.69 を使用しています。以下はコード スニペットです。
サーバーエンドポイント:
Java クライアント:
ここでは、ハンドル メッセージが 1 回呼び出され、対応する sysout が出力され、すぐに onClose が呼び出されます。onError が呼び出されることはありません。
java-websocket - Websocket の 404 に相当
サーバーからクライアントにリソースに関する情報を渡すために websockets を使用しています。websocket エンドポイントは、pathparam を使用して特定のリソースを識別します。例えば:
Endpoint クラスのonOpen
メソッドには、次のロジックがあります。
AJAX ロング ポーリングを使用する場合、リソースが存在しない場合は 404 応答を送信します。クライアントは、再試行しないことを認識します。WebSocket に使用する同等の手法はありますか? 私の考えは次の2つです。
if (!resourceExists)
上記のブロックで次のコードを使用します。session.close(new CloseReason(CUSTOM_NOT_FOUND_CODE, "Resource ID not found")); return;
CUSTOM_NOT_FOUND_CODE
4000 ~ 4999 の範囲の CloseCode はどこにありますか。ServerEndpointConfig.Configurator
このエンドポイントの実装のどこかでこのロジックを実行し、接続のアップグレードが発生する前に 404 を返します。これは私にとって最良のアプローチのように思えますが、メソッドから標準の HTTP エラー応答を送信する方法はないようmodifyHandshake
です。このロジックは Filter で実行します。ただし、ここでの問題は、フィルターにリソースをロードした場合、それをエンドポイントに渡すにはどうすればよいかということです。HTTP リクエストを使用すると、フィルターにリクエスト属性を追加して、サーブレットで使用できるようになります。しかし、websocket で同じことを実現する簡単な方法はないようです。もちろん、Endpoint クラスでリソースを再度読み込むこともできますが、それは作業の重複です。
これは一般的なシナリオに違いないと確信しているので、ここで受け入れられているベストプラクティスのアプローチはありますか?
tomcat - Java で記述された Websocket サーバーとクライアント エンドポイントの間で交換されるメッセージに gzip 圧縮を実装する
gzip 圧縮を使用してメッセージを転送する方法について、javax.websocket.Session の getBasicRemote() および getAsyncRemote() の sendText() および sendBinary() メソッドに関する特定のドキュメントは見当たりません。私は、ピア間で毎秒数百のメッセージを送信できる高性能メッセージングアプリを作成しています。これらのメッセージの一部は小さく、一部は大きく、gzip 圧縮を使用できます (データ転送が 90% 少なくなります)。このメッセージごとの圧縮を Jetty 9 またはその他のコンテナーで機能させるために使用する特別な拡張機能はありますか?
注: 私はブラウザ ベースの WebSocket ソリューションを開発していません。クライアントとサーバーは厳密には Java クライアントであり、任意の JSR-356 Websocket コンテナー実装で動作します。
java-websocket - サーブレットで使うWebsocket、「public static void main(final String[] args)」は必要?
Java Websocket を使用するのはこれが初めてであり (Jetty を使用せず、代わりに JSR-356 を使用)、私が見たすべての例では、「public static void main(final String[] args)」を使用して Websocket クライアントをマップしています。およびサーバー エンドポイント。
Java サーブレットに基づいてアプリを作成している場合、そのメソッドは 2 つのソケット エンドポイントを接続するために必要ですか? 必要な場合、その接続クラスでそのメソッドを実行するためにどのように呼び出されるのでしょうか?
java - Undertow Websocket Bean インジェクション CDI の問題
undertow を使用して、インジェクションの CDI 使用が websocket で機能しない理由がわかりません。
以下は、単純な websocket エンドポイント用のコードです。
もちろん問題は、注入されたプロパティが null であることです。もちろん、この展開と以下に説明するステートレス Bean の注入のために残りの部分を使用しても問題はありません。これを回避する方法はありますか? Bean である必要なプロパティを初期化するだけで、どのような問題が発生する可能性がありますか? それは間違いなく機能するからです。
RetrieveAccessor retrieveAccessor = new.... {コード}
tomcat - Tomcat の WebSocket ハンドシェイクが予期しない応答コード 500 を返す
注釈を使用せずに、プログラムでエンドポイントを登録する WebSocket アプリケーションがあります。
関連するコードは次のとおりです。
依存関係が Maven を介して tomcat-websocket および tomcat-websocket-api ライブラリにある、組み込みの Jetty コンテナーを使用して IDE 内で実行すると、すべて正常に動作しますが、Tomcat (8.5.5) にデプロイしてから試してください。 WebSocket 接続を確立するために、ブラウザーのコンソールに次のエラーが表示されます。
'ws://127.0.0.1:8080/echo' への WebSocket 接続に失敗しました: WebSocket ハンドシェイク中のエラー: 予期しない応答コード: 500
Catalina の出力にエラーやその他の情報が記録されず、この問題をデバッグする方法がわかりません。
コンパイル時には多くの情報がわからないため、エンドポイントをプログラムで構成する必要があります。そのため、アノテーション ソリューションを紹介しないでください。
ログ レベルを FINE に設定しました。これは関連するスニペットです。