2016-11-20 3 views
0

私はウェブソケットを初めて使用しています。私のセットアップで送信後にOPEN readystateでwebsocket接続を維持する方法は?

は、私はそのonmessageコールバックを設定し、WebSocketオブジェクトを作成し、テストするためにそのsendメソッドを呼び出しゴー(playground

で書かれた些細なのWebSocketサーバーを持っています。

var w = new WebSocket("ws://localhost:12345/echo") 

w.onmessage = (msg) => { 
    console.log(msg.data) 
} 

w.onopen =() => { 
    w.send("Hello") // this fires OK 
} 

サーバーコードに基づいて発生すると予想されるのは、「Hello」メッセージを受信し、クライアントに1.5秒ごとに「yahoo」を送信し続けることです。実際には "こんにちは"が送られてきますが、 "yahoo"のどれもそれを通過しません。それはWebSocket.readystateに沿ったどこかが3(CLOSED)になったようです。

明確にするために、サーバーは「Hello」を受信して​​印刷し、実際には1.5秒ごとに「yahoo」メッセージを送信しますが、接続は閉じられているため、onmessageコールバックは発生しません。

何か不足または誤解していますか?

EDIT:comparison github.com/gorilla vs. golang.org/x/netを介して、golang.org/x/net websocket実装はpongをサポートしていません。これはそれの確認かもしれません。

EDIT:golang.org/x/net/websocketパッケージは、ハンドラServeHTTP関数が返ってくるときにwebsocket接続を閉じます。デフォルトでは、WebSocket接続はハンドラのインスタンスに関連付けられています。

+0

gorilla/websocketを使用することをお勧めします。Goのベスト・インプリメンテーションは、例をご覧ください:https://github.com/gorilla/websocket/tree/master/examples –

答えて

1

ハンドラ関数が返ってくると、EchoServerの場合、ソケットはhttpフレームワークによって自動的に閉じられます。 クライアントにyahoo応答を書き込むループのgoルーチンを開始するので、EchoServer関数は、応答を送信する時間が来る前に終了します(したがって、ソケットを閉じる)。

解決策は、goルーチンの起動を取り除き、EchoServerのループを実行することです。

関連する問題