TestChatServer/go/chatroom.go (52 lines of code) (raw):
//
// Copyright 2012 Square Inc.
// Portions Copyright (c) 2016-present, Facebook, Inc.
// All rights reserved.
//
// This source code is licensed under the license found in the
// LICENSE-examples file in the root directory of this source tree.
//
package main
import (
"code.google.com/p/go.net/websocket"
"net/http"
)
// Msg stores both the message and the connection
type Msg struct {
sender *websocket.Conn
msg string
}
func run(reg chan *websocket.Conn, unreg chan *websocket.Conn, msg chan Msg) {
conns := make(map[*websocket.Conn]int)
for {
select {
case c := <-reg:
conns[c] = 1
case c := <-unreg:
delete(conns, c)
case msg := <-msg:
for c := range conns {
if c != msg.sender {
websocket.Message.Send(c, msg.msg)
}
}
}
}
}
func newChatServer(reg chan *websocket.Conn, unreg chan *websocket.Conn, msg chan Msg) websocket.Handler {
return func(ws *websocket.Conn) {
reg <- ws
for {
var message string
err := websocket.Message.Receive(ws, &message)
if err != nil {
unreg <- ws
break
}
msg <- Msg{ws, message}
}
}
}
func main() {
reg := make(chan *websocket.Conn)
unreg := make(chan *websocket.Conn)
msg := make(chan Msg)
http.Handle("/chat", websocket.Handler(newChatServer(reg, unreg, msg)))
http.Handle("/", http.FileServer(http.Dir("../static")))
go run(reg, unreg, msg)
err := http.ListenAndServe(":9000", nil)
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}