2012-02-10 15 views
1

WebSocketを処理してメッセージをエコーバックする単純なのアプリケーションを実装しました。しかし、私はどのようにws.close();をJavaScriptクライアントから処理するのですか?以下のコードで試してみましたが、handle_message({close, Reason})は呼び出されず、ws.onclose = function(evt) {}はJavaScriptクライアントでは実行されません。YawsのクライアントからWebSocketを閉じる方法を教えてください。

node.js websocketと対話する同じJavaScriptクライアントコードを使用すると、クライアントはws.close();の直後にoncloseイベントを受け取ります。

-module(mywebsocket). 
-export([handle_message/1]). 

handle_message({text, Message}) -> 
    {reply, {text, <<Message/binary>>}}; 

handle_message({close, Reason}) -> 
    io:format("User closed websocket.~n", []), 
    {close, normal}. 

答えて

2

更新答え:ここで

は私の簡単な appmodためのコードである16834cをコミットgithubののよう

、最終的にはイチゴ腫1.93の一部となり、イチゴ腫はへの新しいコールバックを渡しますクライアントがcloseメッセージを送信したときのWebSocketsコールバックモジュール。コールバックは次のとおりです。

{close, Status, Reason} 

Statusは、クライアントから送信されたに近い状態、またはクライアントがステータス値が含まれていなかった場合(ノーマルクローズのためのRFC 6455で指定された)1000年の数値のいずれかです。 Reasonは、クライアントから渡された任意の理由文字列を保持するバイナリです。クライアントが理由を送信しなかった場合は空のバイナリになります。 CloseReasonは、どちらかのRFC 6455で許可されている(クライアントに返されるステータスコード1000になり)、ノーマルクローズまたは他の法的な数値ステータスコードのための原子normalです

closeメッセージのためのあなたのコールバックハンドラは{close, CloseReason}を返さなければなりません。 CloseReasonは、クライアントが渡した値Reasonとは無関係であることに注意してください。技術的にはCloseReasonは他のErlangの用語でもよく、この場合、Yawsはステータス1000を返し、その用語をerlang:exit/1に渡してWebソケットを処理するErlangプロセスを終了するが、RFC6455に基づいて、CloseReasonの場合はnormal 。イチゴ腫githubのによって廃止

オリジナルの答えは、16834cをコミット:

イチゴ腫は、コールバックモジュールに{close, Reason}メッセージを渡すことはありません。むしろ、{close, Reason}は、コールバックモジュールがwsソケットを閉じることを決定した場合はhandle_message/1からの有効な戻り値です。

私は、ユーザーがWebページ上の「BYE」メッセージを入力した場合、クライアントにthis._ws.close()を呼び出すためにイチゴ腫(バージョン1.92)に同梱されてwebsockets_example.yawsファイルを変更し、oncloseイベントということを示すために_onclose機能にアラートを追加トリガーされます。この場合、アラートが発生しました。「バイ」メッセージにより、サーバーはwsソケットを明示的にクローズします。しかし、ユーザーが入力したメッセージに関係なく、クライアントでthis._ws.close()を呼び出すように例を変更しました。この場合、oncloseのアラートは発生しませんでした。この場合、lsofのチェックでは、ブラウザからYawsがまだ存在していたことがわかりました。

これで、Yawsウェブソケットサポートがクライアントのクローズを検出せず、その終了を終わらせるバグが起きたと思います。私はそれを修正することができます私は表示されます。

+0

ありがとう、これは参考になりました。私は[私はどのようにYawsを使用してappmodでWebSocketメッセージを処理するに投稿したクライアントコードを使用しますか?](http://stackoverflow.com/questions/9187809/how-to-handle-websocket-messages-in-an-appmod-私はボタンを "切断"しています。 – Jonas

+0

Chromeを使う17.0.963.46 'ws.close()'が呼び出されたときに、ブラウザからYawsへの 'close'メッセージは表示されません。私もChromeのバージョン16を試してみましたが、どちらかと見えませんでした。どのブラウザを使用していますか? –

+0

私はChrome 16を使用しています。同じクライアントコードがnode.jsサーバーで動作しました。 – Jonas

関連する問題