chatroom.go 1.2 KB

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