GolangでWebsocketで非同期でReceive, Sendをする
Golangで書かれたWebsocketサーバーで、非同期でReceive, Sendをできるようにしたいと思っています。
下のようにchat_receiver
, chat_sender
関数内でfor をつかってループさせ、それをgoroutineを使って並列実行させようと考えています。
しかし、このコードを実行しwebsocket clientでアクセスすると、use of closed network connection
と表示されます。
この問題を解決するにはどうすればいいのでしょうか?
chat_senderはStdinから読み込まれた文字列を相手に送り、
chat_receiverは相手から送られた文字列をStdoutに表示しようとしています。
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)
}