chatroom.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package main
  2. import (
  3. "code.google.com/p/go.net/websocket"
  4. "net/http"
  5. )
  6. type Msg struct {
  7. sender *websocket.Conn
  8. msg string
  9. }
  10. func run(reg chan *websocket.Conn, unreg chan *websocket.Conn, msg chan Msg) {
  11. conns := make(map[*websocket.Conn]int)
  12. for {
  13. select {
  14. case c := <-reg:
  15. conns[c] = 1
  16. case c := <-unreg:
  17. delete(conns, c)
  18. case msg := <-msg:
  19. for c := range conns {
  20. if c != msg.sender {
  21. websocket.Message.Send(c, msg.msg)
  22. }
  23. }
  24. }
  25. }
  26. }
  27. func newChatServer(reg chan *websocket.Conn, unreg chan *websocket.Conn, msg chan Msg) websocket.Handler {
  28. return func(ws *websocket.Conn) {
  29. reg <- ws
  30. for {
  31. var message string
  32. err := websocket.Message.Receive(ws, &message)
  33. if err != nil {
  34. unreg <- ws
  35. break
  36. }
  37. msg <- Msg{ws, message}
  38. }
  39. }
  40. }
  41. func main() {
  42. reg := make(chan *websocket.Conn)
  43. unreg := make(chan *websocket.Conn)
  44. msg := make(chan Msg)
  45. http.Handle("/chat", websocket.Handler(newChatServer(reg, unreg, msg)))
  46. http.Handle("/", http.FileServer(http.Dir("../static")))
  47. go run(reg, unreg, msg)
  48. err := http.ListenAndServe(":9000", nil)
  49. if err != nil {
  50. panic("ListenAndServe: " + err.Error())
  51. }
  52. }