Goのwebsocketで起きたuse of closed network connectionについて
実は以前にも似たような質問をしているのですが・・・
GolangでWebsocketで非同期でReceive, Sendをする
下記のコードを実行するとSender Error use of closed network connection...
と表示されます。
sync.WaitGroupを使って全てのws
へのSendが終わるまで待って、もし、err != nil
ならconnectionの一覧として使っているconns
から削除しています。
このエラーを解決するにはどうすればいいのでしょうか? また なぜ起こるのでしょうか?
package main
import (
"fmt"
"golang.org/x/net/websocket"
"net/http"
"sync"
)
type Message struct {
Name string
Message string
}
var conns = make(map[*websocket.Conn]bool)
var wg sync.WaitGroup
func chat_receiver(ws *websocket.Conn, msg *Message) {
fmt.Println("Chat Receiver")
conns[ws] = true
err := websocket.JSON.Receive(ws, msg)
fmt.Println("Received data:", msg)
if err != nil {
fmt.Println("Receiver Error:", err)
ws.Close()
delete(conns, ws)
}
fmt.Println("Data received")
}
func chat_sender(msg *Message) {
fmt.Println("Chat Sender")
fmt.Println(conns)
for ws, _ := range conns {
wg.Add(1)
go func(ws *websocket.Conn) {
fmt.Println(ws)
err := websocket.JSON.Send(ws, msg)
fmt.Println("Message sent")
if err != nil {
fmt.Println("Sender Error:", err)
ws.Close()
delete(conns, ws)
}
defer wg.Done()
}(ws)
wg.Wait()
}
}
func handler(ws *websocket.Conn) {
var msg Message
chat_receiver(ws, &msg)
chat_sender(&msg)
}
func main() {
http.Handle("/", http.FileServer(http.Dir(".")))
http.Handle("/chat", websocket.Handler(handler))
fmt.Println("serve on localhost:4283")
err := http.ListenAndServe(":4283", nil)
if err != nil {
fmt.Println(err)
}
}