func main() { // use verbose logger socketio.Log = socketio.VerboseLogger sio := socketio.NewServer(nil) http.Handle("/", http.FileServer(http.Dir("www/"))) http.Handle("/socket.io/", http.StripPrefix("/socket.io/", sio.Handler(func(c *socketio.Conn) { var msg socketio.Message var nick string for { if err := c.Receive(&msg); err != nil { break } event, _ := msg.Event() switch event { case "nickname": if err := msg.ReadArguments(&nick); err != nil { continue } mu.Lock() if nicks[nick] != "" { c.Reply(&msg, true) } else { c.Reply(&msg, false) nicks[nick] = nick sio.EmitExcept(c, "announcement", nick+" connected") sio.Emit("nicknames", nicks) } mu.Unlock() case "user message": var payload string if err := msg.ReadArguments(&payload); err != nil { continue } sio.EmitExcept(c, "user message", nick, payload) } } if nick != "" { mu.Lock() delete(nicks, nick) sio.Emit("announcement", nick+" disconnected") sio.Emit("nicknames", nicks) mu.Unlock() } }))) go func() { time.Sleep(2e9) log.Println("Spawning echo client") echo() }() log.Println("Server starting. Tune your browser to http://localhost:8080/") if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal("ListenAndServe:", err) } }