問題タブ [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.

0 投票する
1 に答える
78 参照

ruby-on-rails - イニシャライザの WebSocket がデタッチ モードで開始しない

私の Web アプリケーションは HTTP サーバーと WebSocket サーバーで構成されており、どちらも Rails で実行されています。Websockets の場合、次のように初期化子で開始する em-websocket を使用しています。

これは、「rails s」でサーバーを起動すると正常に動作しますが、デタッチ モード (「rails s -d」) では動作しません。JS経由でWebsocketサーバーに接続しようとすると、まだ接続状態にあると表示されるので、何かがブロックしていると思います。また、これはスレッドに関連している可能性があると思います。

また、thin と unicorn でサーバーを起動しようとしましたが、どちらも Websocket サーバーの起動に失敗します。

私はここで大会に反対していますか?

0 投票する
0 に答える
173 参照

ruby-on-rails - EventMachine::WebSocketClient.connect により、サーバー側で onclose がトリガーされます

私の Rails アプリケーションには 3 つの部分があります。

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 アプリケーション内でサーバーとクライアントが同じメカニズムを使用しているためであるということです。

0 投票する
1 に答える
516 参照

ruby - em-websocketでブロードキャストまたは接続する方法は?

0 投票する
1 に答える
441 参照

session - Rail 4 セッション Cookie を websocket スレッドから復号化する

レール 4.1.8、ルビー 2.1.5p273

EventMachine::WebSocket内部スレッドからセッション ID を取得しようとしています。

sessioncookieオブジェクトはここでは利用できないため、Websocket ハンドシェイク ヘッダーから手動で Cookie を復号化する必要があります。クッキーは次のようになります。

これこのバリアントを試しましたが、どちらも失敗しました

最初の方法:

次のような文字列を取得します。

この文字列を試してみるとMarshal.load、エラーが発生します:


2 番目の方法:

このエラーを取得します。

このクッキーを解読する方法は?

0 投票する
1 に答える
686 参照

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)、クライアントが多すぎたり、待機時間が長すぎたりすると、頻繁に中止されます。

だから私の質問は

  1. HTTPストリームサーバーにWebSocketクライアントを実装する方法は? (Sinatra の代わりに別の lib を使用しても問題ありません)
  2. Sinatra Stream に WebSocket クライアントを実装できる場合、Sinatra Stream サーバーの安定性を向上させるにはどうすればよいですか? (IOError を避ける)

下手な英語でごめんなさい。どうもありがとうございました!

0 投票する
2 に答える
164 参照

ruby-on-rails - em-websocket send() あるクライアントから別のクライアントに 2 つのサーバーを介して送信する

2 つの websocket クライアントがあり、それらの間で情報を交換したいと考えています。

ソケット サーバーの 2 つのインスタンスがあり、1 つ目は個人情報を取得し、フィルター処理して 2 つ目に送信するとします。

何かをしようとしましたが、通常のダークコードを取得しました。この機能を実装する方法がわかりません。

0 投票する
1 に答える
130 参照

ruby - EventMachine のクォンタムが原因で長い遅延が発生しています。どうすれば高速化できますか?

EventMachine を使用してリアルタイム アプリケーションを開発しています。2 つのクライアントABは、標準の 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 を見つける必要があります。

0 投票する
1 に答える
106 参照

ruby - Activerecord オブジェクトを Em-Websocket 接続に関連付けるにはどうすればよいですか?

私はルビーが初めてです。em-websocket を使用してチャット クライアントを実装しようとしています。次のコードがあります。

基本的に、Person (ActiveRecord オブジェクト) とそれに対応する WebSocket::Connection オブジェクトのリストを維持しようとしています。

サーバーコード

移行

更新: マージできなくても。これが「x」という名前の人に属しているというメモをwebsocketに添付できるはずですか?

0 投票する
0 に答える
32 参照

ruby - em-websocket を使用した Ruby ビルボード

sinatra を使用して、サーバーによって開始されたブラウザーにメッセージを表示するためのビルボードを構築しようとしています。サーバーコードで行う最も明白なことは次のようなものでした:

サーバ:

index.haml

app.js

ただし、テキストは最後のスリープ後にブラウザーに一度に表示されるため、最後の行しか表示されません。接続が確立されると、受信メッセージへの反応としてのみ、サーバー側から何かを送信できないようです。

以下のようなRubyクライアントで試してみましたが、テキストを送信するたびに新しい接続を作成する必要があり、ループを .callback または .stream メソッドに入れても機能しません。

これを達成するためのより良い方法が必要だと思いますが、どの方法でお願いしますか?