私はCowboy websocketサーバーを持っています。私はgen_eventハンドラを登録して、websocketを介して何かを送信したいと考えています。 websocket_handle/3
で定期的な同期リクエストに返信できるようにする必要もあります。私はcowboy_http_websocket_handler.erlに何も明白ではなく、cowboy_http_websocket:websocket_send/3はエクスポートされていません。オープンソケットで何かを送る簡単な方法がないのですか?カウボーイとwebsocketで非同期にデータを送信するにはどうすればよいですか?
答えて
the example websocket handlerでは、websocket_info/3はこのようなものを送信するために使用されます。 websocketのinitコードにgen_event:add_sup_handler/3をwebsocket_info/3と組み合わせてください。接続のpidをハンドラの状態に保ち、非同期イベントでメッセージを送信するだけです。
私は長いこと前にこれに答えましたが、私は質問があります...なぜあなたのカウボーイアプリの開始ではなくwebsocketのintコードでイベントハンドラを追加しますか? –
websocketのinitコードは、セッションの設定時に実行されます。カウボーイは一度だけ初期化されます。これは、接続を開くためのメッセージを送信する必要があり、アプリケーションの起動時に将来接続するためのpidはわかりません。それは、最近、カウボーイの新しいバージョンが出てきたので、これは時代遅れかもしれないと言いました。 – nmichaels
私はあなたと同様の問題を抱えており、私はそれを解決した方法を追加しました。私を正しい方向に向けてくれてありがとう。それは、同様の問題に直面している他の人には役に立ちます。 –
@nmichaels答えは正しい方向に私を指摘し、私は正常にカウボーイアプリでwebsocket_infoに内部メッセージを送信するためにgen_eventを使用しました。しかし、答えは少し日付で、カウボーイは大きく変わったので、私はそれに追加して、最新のカウボーイバージョンで動作するソリューションを提供したいと思います。うまくいけば、これはErlangとカウボーイに新しいことを助けるでしょう。
カウボーイでgen_eventを実装するために必要な3つのステップ
gen_eventを起動して、あなたのハンドラIは、グローバルイベントと呼ばmy_eventsを登録している。ここ
start(_Type, _Args) -> Dispatch = cowboy_router:compile(wrinqle_routes:routes_configuration()), {ok, _} = cowboy:start_http(http, 100, [{port, 3000}], [{env, [{dispatch, Dispatch}]}]), pg2:start(), gen_event:start({global,my_events}), gen_event:add_handler({global,my_events},my_event_handler,[]).
イベントハンドラを作成します。
これで、カウボーイのどこからでもイベントのイベントハンドラに通知できます。例として以下のコードはwebsocket_handler
{ _,_ }-> gen_event: notify(global:whereis_name(my_events),{event_name,self()}), {ok,Req,State};
すべてこのコードは、グローバルイベントのmy_eventsの下で登録されたイベントを通知されてやっているからイベントを発生させます。それでおしまい。
OPに問題があったもう一つの問題は、初期化時にpidがわからない接続と接続を開くためにメッセージを送信する方法でした。この問題を解決するには、チャネルの下にプロセスIDを登録するpg2を使用できます。これは、PIDを管理するための非常に便利なモジュールです。したがって、上記のコードは、この
[H|T] = pg2:get_members(Name)
gen_event: notify(global:whereis_name(my_events),{event_name, H}).
そして、あなたは特定のPIDにし、特定のソケットへの拡張により、メッセージを送信することができます。この方法のようなものに変換することができます。
- 1. libwebsocket経由で非同期データを送信するにはどうすればよいですか?
- 2. jQuery非同期でフォームを送信するにはどうすればよいですか?
- 3. GWT - フォームを非同期に送信するにはどうすればよいですか?
- 4. C++を使用してwebsocket経由でデータを送信するにはどうすればよいですか?
- 5. カウボーイとMessagePackでwebsocket経由でバイナリデータを送信
- 6. セントラルエリアにデータを送信するにはどうすればよいですか?
- 7. 非同期コールバックをテストするにはどうすればよいですか?
- 8. 同期と非同期の通信は正確にはどうですか
- 9. WebSocketで大きなメッセージを送信するにはどうすればよいですか?
- 10. Websocket:サーバーデータが同期して送信されていますか?
- 11. Playフレームワークで非同期/非ブロッキングMySQLクエリを実行するにはどうすればよいですか?
- 12. Connectミドルウェアで非同期初期化を使用するにはどうすればよいですか?
- 13. 非送信ボタンのフォーム送信を防ぐにはどうすればよいですか?
- 14. TornadoとRedisを非同期で使用するにはどうすればよいですか?
- 15. WCFと非同期にRESTベースのサービスを使用するにはどうすればよいですか?
- 16. Linuxで非同期信号はどのように処理されますか?
- 17. フォームは同期または非同期で送信されますか?
- 18. アップロードするファイルとデータを送信するURLを調べるにはどうすればよいですか?
- 19. Adobe AIRのネイティブコンテキストメニューにアイテムを非同期で追加するにはどうすればよいですか?
- 20. NginxでLiftを非同期的に使用するにはどうすればよいですか?
- 21. iPhone SDKで非常に簡単なステータスアップデートを送信するにはどうすればよいですか?
- 22. Chromiumで投稿データとヘッダーデータを送信するにはどうすればよいですか?
- 23. JavascriptとDelphi間でデータを送信するにはどうすればよいですか?
- 24. Python Tornado:これを非同期にするにはどうすればよいですか?
- 25. Wordpressでカスタムフィールドを同期するにはどうすればよいですか?
- 26. キーイベントをAndroidで送信するにはどうすればよいですか?
- 27. プログラムでUILongPressGestureを送信するにはどうすればよいですか?
- 28. PLISTをBluetoothで送信するにはどうすればよいですか?
- 29. C#でVK_MEDIA_NEXT_TRACKを送信するにはどうすればよいですか?
- 30. アプリでメールを送信するにはどうすればよいですか?
このトピックに答える最も簡単な方法は、cowboyのgithubで問題を作成し、著者に尋ねることです。 LoïcHoguinは非常に議論の余地があります。 – W55tKQbuRu28Q4xv