2016-01-04 21 views
9

私のコードにWebソケットを開いたままにしておくことは、ただちに_, err := ws.Read(msg)を使用しています。私はそれが確実に動作するとは思わない。golang.org/x/net/websocketを開いたままにする方法は?

他のコードでは、私はsleep loopをやっている人に気づいた。 Webソケットを開いたままにする正しい方法は何ですか&は安定していますか?私は基礎となるライブラリがping/pongsをしていると仮定していますか?

アップデート:サーバで切断された後にリダイアルしないように思われるので、client.goは責任があると私は確信しています。私はa video demonstrating the issueを作った。

+0

私はping/pongsも見たいです。たとえば、クライアントがスリープ状態になると、タイムアウトが何であるか、最後に確認されたかなどを知りたいのです。 – hendry

+0

問題は私のクライアントだと思っています。https://github.com/kaihendry/WebSocketHook/tree/master/client接続が切断されたときはわからないようです。 – hendry

+0

はい、そうです。そのアイデアは、ソケットがそのURLメッセージペイロードを受信するまでオープンで堅牢な状態を保つ必要があるということです。しかし、私の例では堅牢ではありません。 – hendry

答えて

6

元の質問を誤読しました。

いいえ、すぐにやっています。基本的には、WebSocketの接続を維持するためにハンドラが戻るのをブロックする必要があります。メッセージを気にしない場合は、メッセージを破棄して何もしないでください。

人々は、それが何かのように、専用のReadWriteゴルーチンを持つことで行う一般的な方法:

func fishHandler(ws *websocket.Conn) { 
    id := ws.RemoteAddr().String() + "-" + ws.Request().RemoteAddr + "-" + ws.Request().UserAgent() 
    sockets[id] = ws 

    go writePump(ws) 
    readPump(ws) 
} 

func readPump(ws *websocket.Conn) { 
    defer ws.Close() 
    msg := make([]byte, 512) 
    _, err := ws.Read(msg) 
    if err != nil { 
     return 
    } 
} 

func writePump(ws *websocket.Conn) { 
    // Hand the write messages here 
} 
+0

'websocket.Conn.Write'が内部的にmutexによって保護されていることを考慮して、なぜ専用の' Write'グルーオンが必要なのかわかりません。 –

+0

バイナリやテキストメッセージがクライアントによって誤って送信された場合に備えて、 'ws.Read'の後に' ws.Close'を呼び出すことも意味があります。 –

+0

'ws.Read'の' err'をチェックしても、この場合には意味がありません。 –

6

golang.org/x/net/websocketは、RFC 6455からピンポンを実装していませんが、ゴリラのウェブソケットimplementationはそうです。 Gorilla websocketを使用した最小の例

c := time.Tick(pingInterval) 
go func(){ 
     for _ := range c { 
      if err := conn.WriteControl(Ping...); err != nil { 
       handle error 
      } 
     } 
    }() 

      ----- 

conn.SetPongHandler(func(string) error { return conn.SetReadDeadline(time.Now().Add(pingInterval)) }) 
go func(){ 
     for { 
      if _, _, err := conn.NextReader(); err != nil { 
       handle error 
      } 
     } 
    }() 
+0

"github.com/gorilla/websocket"を指定しても、最小のping/pongの例はありません。 https://github.com/gorilla/websocket/blob/master/examples/chat/conn.goが出発点だと言われていますが、クライアントのバイナリの書き方とタイムアウトの監視方法については説明していません。そのような。 – hendry

+0

@hendry私は最小限の例を追加します。 – Uvelichitel

+0

ありがとう、私はクライアントによって実装されているものと、サーバーによって実装されているものをよく理解していません。それをもっと明確にすることができますか? – hendry

関連する問題