問題タブ [em-websocket]
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.
ruby-on-rails - イニシャライザの WebSocket がデタッチ モードで開始しない
私の Web アプリケーションは HTTP サーバーと WebSocket サーバーで構成されており、どちらも Rails で実行されています。Websockets の場合、次のように初期化子で開始する em-websocket を使用しています。
これは、「rails s」でサーバーを起動すると正常に動作しますが、デタッチ モード (「rails s -d」) では動作しません。JS経由でWebsocketサーバーに接続しようとすると、まだ接続状態にあると表示されるので、何かがブロックしていると思います。また、これはスレッドに関連している可能性があると思います。
また、thin と unicorn でサーバーを起動しようとしましたが、どちらも Websocket サーバーの起動に失敗します。
私はここで大会に反対していますか?
ruby-on-rails - EventMachine::WebSocketClient.connect により、サーバー側で onclose がトリガーされます
私の Rails アプリケーションには 3 つの部分があります。
- HTML5 Web ソケットをリッスンする部分 ( em-websocket )
- それらに接続する JavaScript の一部
- そして、タスクが同じ Web アプリケーション ( em-websocket-client )の内部からこれらのソケットに接続することである部分(はい、Phusion Passenger 環境でいくつかの IPC を実行しようとしています)
JavaScript コードは正常に接続し、Web ソケット サーバーはそのようなクライアントに満足していますがem-websocket-client
、奇妙なことが起こっています:onclose
を呼び出すことなくハンドラーが呼び出されonopen
、さらに、Web ブラウザーによって開かれたソケットに対して呼び出されます。ありませんem-websocket-client
。
コマンドラインから別の Ruby スクリプトで実行すると、同じem-websocket-client
コードが計画どおりに機能します。em-websocket-client
コードのサンプルは次のとおりです。
onclose
サーバー側ではEventMachine::WebSocketClient.connect
、クライアント側で実行されるとすぐに呼び出されます。@conn.disconnect
呼びにも来ない。
私が推測できるもう 1 つのことは、この動作はEventMachine
、同じ Rails アプリケーション内でサーバーとクライアントが同じメカニズムを使用しているためであるということです。
session - Rail 4 セッション Cookie を websocket スレッドから復号化する
レール 4.1.8、ルビー 2.1.5p273
EventMachine::WebSocket
内部スレッドからセッション ID を取得しようとしています。
session
cookie
オブジェクトはここでは利用できないため、Websocket ハンドシェイク ヘッダーから手動で Cookie を復号化する必要があります。クッキーは次のようになります。
最初の方法:
次のような文字列を取得します。
この文字列を試してみるとMarshal.load
、エラーが発生します:
2 番目の方法:
このエラーを取得します。
このクッキーを解読する方法は?
ruby - Ruby で HTTP サーバー (Sinatra Stream) に WebSocket 接続を確立する
Sinatra::Streaming (Ruby を使用) を使用して HTTP サーバー (A) を作成します。WebSocket サーバー (B) からデータを読み取り、それをクライアント (C) に転送する必要があります。データの流れは「B→A→C」です。読み取り操作と書き込み操作はリアルタイムで行う必要があります。
可能な解決策として、Sinatra で WebSocket 接続を作成しようとしました。コードはこんな感じ:</p>
faye-websocket など、いくつかの WebSocket クライアント ライブラリを試しました。~/.rvm/gems/ruby-2.0.0-p598/gems/sinatra-contrib-1.4.2/lib/sinatra/streaming.rb:100:in '<<': not opened for writing (IOError)
の実行時と同様にプログラムが失敗しましたout << event.data
。同時に WebSocket 接続が閉じられました。
WebSocket の IO が Sinatra Stream の IO を競合/クローズしているようです。
現在、WebSocket 接続を確立するためのサブプロセスを作成し、サブプロセスが Sinatra サーバー (A) と通信できるようにします。しかし、数十人が A にアクセスすると、システム リソースを消費しすぎる可能性があります。さらに、Sinatra Stream サーバーはnot opened for writing (IOError)
、クライアントが多すぎたり、待機時間が長すぎたりすると、頻繁に中止されます。
だから私の質問は
- HTTPストリームサーバーにWebSocketクライアントを実装する方法は? (Sinatra の代わりに別の lib を使用しても問題ありません)
- Sinatra Stream に WebSocket クライアントを実装できる場合、Sinatra Stream サーバーの安定性を向上させるにはどうすればよいですか? (IOError を避ける)
下手な英語でごめんなさい。どうもありがとうございました!
ruby-on-rails - em-websocket send() あるクライアントから別のクライアントに 2 つのサーバーを介して送信する
2 つの websocket クライアントがあり、それらの間で情報を交換したいと考えています。
ソケット サーバーの 2 つのインスタンスがあり、1 つ目は個人情報を取得し、フィルター処理して 2 つ目に送信するとします。
何かをしようとしましたが、通常のダークコードを取得しました。この機能を実装する方法がわかりません。
ruby - EventMachine のクォンタムが原因で長い遅延が発生しています。どうすれば高速化できますか?
EventMachine を使用してリアルタイム アプリケーションを開発しています。2 つのクライアントA
とB
は、標準の TCP を介して、または em-websocket を使用した WebSocket を介して EventMachine サーバーに接続します。
データが EventMachine を通過するたびに、コードの実行に 95 ミリ秒のヒットがかかります。がサーバーと通信するときA
、95 ミリ秒の遅延があります。が にA
話しかけるとB
、190 ミリ秒の遅延があります。
多くのリクエストが立て続けに発生すると、シーケンスの最後のリクエストを除いて、遅延はなくなります。したがって、10 件の迅速なリクエストを送信すると、それぞれ約 5 ミリ秒後に 9 件の応答が返されますが、10 回目の応答には再び 95 ミリ秒かかります。
これはEventMachine.set_quantumと関係があると推測しました。ドキュメントから:
メソッド: EventMachine.set_quantum
上級ユーザー向け。この関数は、デフォルトのタイマー粒度を設定します。デフォルトでは、100 ミリ秒よりわずかに小さくなっています。より高いまたはより低い粒度を設定するには、この関数を呼び出します。この関数は、add_timer と add_periodic_timer の動作に影響します。ほとんどのアプリケーションは、この関数を呼び出す必要はありません。
極端な条件下でパフォーマンスが低下する可能性があるため、クォンタムを非常に低い値に設定しないでください。10 未満の値を使用しないことをお勧めします。
さて、それは 95ms がどこから来たのかを説明しています。案の定、遅延は を呼び出すことEventMachine.set_quantum
で変更されますが、ドキュメントに警告があるため、この値を微調整することには慎重です。
set_quantum
実際に何をしているのですか?量子変数の意味に関するドキュメントや説明が見つかりません。
これらの遅延を減らすにはどうすればよいですか? クォンタムをたとえば 10ms に減らした場合の潜在的な影響を理解したいと思います。
EventMachine は正しい選択でしょうか? 私は本質的にそれを美化されたTCP接続として使用しています。たぶん、プロセス間通信用の raw ソケットに固執し、EventMachine を使用しない WebSocket サーバー gem を見つける必要があります。
ruby - em-websocket を使用した Ruby ビルボード
sinatra を使用して、サーバーによって開始されたブラウザーにメッセージを表示するためのビルボードを構築しようとしています。サーバーコードで行う最も明白なことは次のようなものでした:
サーバ:
index.haml
app.js
ただし、テキストは最後のスリープ後にブラウザーに一度に表示されるため、最後の行しか表示されません。接続が確立されると、受信メッセージへの反応としてのみ、サーバー側から何かを送信できないようです。
以下のようなRubyクライアントで試してみましたが、テキストを送信するたびに新しい接続を作成する必要があり、ループを .callback または .stream メソッドに入れても機能しません。
これを達成するためのより良い方法が必要だと思いますが、どの方法でお願いしますか?