Exemple #1
0
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)
	}
}