1

私は org.eclipse.jetty.websocketclient を使用しており、異なる URL に対して複数の Web ソケットを開きたいと考えています。私はJavaで作業しています。

どうすればいいですか?複数のスレッドで Web ソケットを開きたい。1. 接続ごとに websocketclient を作成する必要がありますか? 2. websocketclient ファクトリを使用できますか? ありますか?3. websocketclient を 1 つだけ開いて、開いたままにし、何らかの方法で Web ソケットを開く必要がありますか? 4. 複数の Websocket クライアントを作成することの何が問題になっていますか?

4

1 に答える 1

2

この回答では、Jetty 9 WebSockets について説明しています。

1 があり、新しい接続WebSocketClientを確立するための呼び出しごとにブラウザと考えてください。connect()

への各呼び出しにconnect()は新しい WebSocket インスタンスが必要です。各インスタンスは WebSocketClient によって管理され、Executor本質的に各 WebSocket インスタンスが独自のスレッドになります。

フォローアップの回答

理想的には、WebSocketClient を 1 つだけ持ち、1 回だけ開始します。アクティブな websocket 接続がある間は開始したままにしておきます。接続がなくなったら WebSocketClient を停止します。

一般的に言えば、何をしているのかわからない限り、複数のリクエストでオブジェクトを再利用することは避けてください。例: ClientUpgradeRequest と URI は WebSocket セッションに関連付けられており、複数の接続で再利用された場合、最初の接続の終了時に状態が変化し、他の接続ではデータが無効になり、ガベージ コレクションの参照もあります。すべての接続が閉じられるまで、古い接続のクリーンアップが困難になります。

connect()同時に呼び出すことができます。各接続の試行は、Executor の動作に基づいて処理されます (例: シングルスレッドの Executor がある場合、一度に 1 つの接続のみが発生します)。

接続ごとに新しい WebSocketClient を作成すると、リソースが過度に浪費されます。これは、着信要求ごとに WebServer 全体を開始するようなものです。WebSocketClient は、セレクター、スレッド化、セッション トラッキングなどを管理します。古い http クライアント ライブラリがこの動作をしていることから、あなたがどこから来たのかはわかりますが、spdy と http のおかげで、それらの http クライアントでさえ、この新しいブラウザー風のモデルに更新されています。 /2.

于 2015-03-02T22:05:18.917 に答える