12089


Golangで書かれたWebsocketサーバーで、非同期でReceive, Sendをできるようにしたいと思っています。  
下のように`chat_receiver`, `chat_sender`関数内でfor
をつかってループさせ、それをgoroutineを使って並列実行させようと考えています。  
しかし、このコードを実行しwebsocket clientでアクセスすると、`use of closed network
connection`と表示されます。  
この問題を解決するにはどうすればいいのでしょうか?

chat_senderはStdinから読み込まれた文字列を相手に送り、  
chat_receiverは相手から送られた文字列をStdoutに表示しようとしています。

[code]

    
    package main
    
    import (
        "bufio"
        "fmt"
        "golang.org/x/net/websocket"
        "net/http"
        "os"
    )
    
    func chat_sender(ws *websocket.Conn) {
        for {
            bio := bufio.NewReader(os.Stdin)
            line, _, err := bio.ReadLine()
            if err != nil {
                fmt.Println(err)
                fmt.Println("returned")
                return
            }
            websocket.Message.Send(ws, line)
    
        }
    }
    
    func chat_receiver(ws *websocket.Conn) {
        for {
            var st string
            if err := websocket.Message.Receive(ws, &st); err != nil {
                fmt.Println("err: ", err)
                return
            }
            fmt.Println("chat receive:", st)
            fmt.Println("returned")
        }
    }
    
    func chatHandler(ws *websocket.Conn) {
        go chat_sender(ws)
        go chat_receiver(ws)
    }
    
    func main() {
        http.HandleFunc("/chat", func(w http.ResponseWriter, req *http.Request) {
            s := websocket.Server{Handler: websocket.Handler(chatHandler)}
            s.ServeHTTP(w, req)
    
        })
        fmt.Println("port:", 9563)
        http.ListenAndServe(":9563", nil)
    }
    
    
    
    
[/code]


CC BY-SA 3.0
2015-07-06T11:47:57.270
12087
2015-07-06T12:11:39.977
5246
question
go websocket
GolangでWebsocketで非同期でReceive, Sendをする


chatHandler関数を抜けた時点でコネクションが終了してしまうので、接続中はchatHandler内でブロックするようにしてください。

[code]

    func chatHandler(ws *websocket.Conn) {
        go chat_receiver(ws)
        chat_sender(ws)
    }
    
[/code]


CC BY-SA 3.0
2015-07-06T12:11:39.977
12089
2015-07-06T12:11:39.977
3639
12087
answer