12030


Golangでwebsocketを使って、

ある一定時間だけReceiveし、もし、その間になんらかのデータが送られてきたらそのデータについて処理するが、その時間内に何も来なかったら、こちらからデータを送る方法はありますか?

下の例だとずっとReceiveで送られてくるのを待ち続けてしまいます。どうすればいいのでしょうか?

一定時間(例えば5秒間)Receiveする -> もし、その間にデータが送られてきたら ->
そのデータを処理する。送られて来なければ、こちらからデータを送る

ということがしたいです。

[code]

    
    package main
    
    import (
        "fmt"
        "golang.org/x/net/websocket"
        "io/ioutil"
        "net/http"
        "os"
    )
    
    func picHandler(ws *websocket.Conn) {
        websocket.Message.Receive(ws, &s) 
        // なんらかの処理
    
        // もし、一定時間過ぎたなら
            websocket.Message.Send(ws, pic)
    }
    
    func main() {
        if err != nil {
            fmt.Fprintln(os.Stderr, err)
        }
        http.HandleFunc("/pic", func(w http.ResponseWriter, req *http.Request) {
            s := websocket.Server{Handler: websocket.Handler(picHandler)}
            s.ServeHTTP(w, req)
    
        })
        fmt.Println("port:", 9563)
        http.ListenAndServe(":9563", nil)
    }
    
    
    
[/code]


CC BY-SA 3.0
2015-07-04T13:44:31.243
12029
2015-07-05T09:35:57.980
2015-07-05T09:35:57.980
5246
5246
question
go websocket
GolangでWebsocketでReceiveで一定時間を経過したらデータを送る


`SetReadDeadline`を使うことで、  
指定時間までに受信できなかった場合にタイムアウトエラーを発生させることができます。

[code]

    func picHandler(ws *websocket.Conn) {
        var s, pic string
    
        // 5秒後にタイムアウト
        ws.SetReadDeadline(time.Now().Add(time.Second * 5))
    
        err := websocket.Message.Receive(ws, &s)
    
        // タイムアウトが発生したかチェック
        if operr, ok := err.(*net.OpError); ok && operr.Timeout() {
            websocket.Message.Send(ws, pic)
        }
    }
    
[/code]


CC BY-SA 3.0
2015-07-04T14:07:15.063
12030
2015-07-04T14:07:15.063
3639
12029
answer