chatroom.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. //
  2. // Copyright 2012 Square Inc.
  3. // Portions Copyright (c) 2016-present, Facebook, Inc.
  4. // All rights reserved.
  5. //
  6. // This source code is licensed under the license found in the
  7. // LICENSE-examples file in the root directory of this source tree.
  8. //
  9. package main
  10. import (
  11. "code.google.com/p/go.net/websocket"
  12. "net/http"
  13. )
  14. // Msg stores both the message and the connection
  15. type Msg struct {
  16. sender *websocket.Conn
  17. msg string
  18. }
  19. func run(reg chan *websocket.Conn, unreg chan *websocket.Conn, msg chan Msg) {
  20. conns := make(map[*websocket.Conn]int)
  21. for {
  22. select {
  23. case c := <-reg:
  24. conns[c] = 1
  25. case c := <-unreg:
  26. delete(conns, c)
  27. case msg := <-msg:
  28. for c := range conns {
  29. if c != msg.sender {
  30. websocket.Message.Send(c, msg.msg)
  31. }
  32. }
  33. }
  34. }
  35. }
  36. func newChatServer(reg chan *websocket.Conn, unreg chan *websocket.Conn, msg chan Msg) websocket.Handler {
  37. return func(ws *websocket.Conn) {
  38. reg <- ws
  39. for {
  40. var message string
  41. err := websocket.Message.Receive(ws, &message)
  42. if err != nil {
  43. unreg <- ws
  44. break
  45. }
  46. msg <- Msg{ws, message}
  47. }
  48. }
  49. }
  50. func main() {
  51. reg := make(chan *websocket.Conn)
  52. unreg := make(chan *websocket.Conn)
  53. msg := make(chan Msg)
  54. http.Handle("/chat", websocket.Handler(newChatServer(reg, unreg, msg)))
  55. http.Handle("/", http.FileServer(http.Dir("../static")))
  56. go run(reg, unreg, msg)
  57. err := http.ListenAndServe(":9000", nil)
  58. if err != nil {
  59. panic("ListenAndServe: " + err.Error())
  60. }
  61. }