debuger.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.
  2. // Use of this source code is governed by a MIT license that can
  3. // be found in the LICENSE file.
  4. package debug
  5. import (
  6. "fmt"
  7. "net/http"
  8. "golang.org/x/net/websocket"
  9. )
  10. type Server struct {
  11. Port string
  12. Addr string
  13. Path string
  14. Msg chan string
  15. chs []chan string
  16. }
  17. type Client struct {
  18. Port string
  19. Addr string
  20. Path string
  21. ws *websocket.Conn
  22. }
  23. var defaultPort = ":8080"
  24. func NewServer() *Server {
  25. return &Server{
  26. Port: defaultPort,
  27. Addr: "localhost",
  28. Path: "/echo",
  29. Msg: make(chan string),
  30. chs: make([]chan string, 0),
  31. }
  32. }
  33. func NewClient() Client {
  34. return Client{
  35. Port: defaultPort,
  36. Addr: "localhost",
  37. Path: "/echo",
  38. }
  39. }
  40. func (c Client) ConnectAndListen() error {
  41. ws, err := websocket.Dial("ws://"+c.Addr+c.Port+c.Path, "", "http://"+c.Addr)
  42. if err != nil {
  43. return err
  44. }
  45. defer ws.Close()
  46. var m string
  47. for {
  48. err := websocket.Message.Receive(ws, &m)
  49. if err != nil {
  50. fmt.Print(err)
  51. return err
  52. }
  53. fmt.Print(m)
  54. }
  55. }
  56. func (s *Server) ListenAndServe() error {
  57. http.Handle(s.Path, websocket.Handler(func(ws *websocket.Conn) {
  58. defer ws.Close()
  59. mc := make(chan string, 10)
  60. s.chs = append(s.chs, mc)
  61. for m := range mc {
  62. websocket.Message.Send(ws, m)
  63. }
  64. }))
  65. go func() {
  66. for msg := range s.Msg {
  67. for _, c := range s.chs {
  68. func(a chan string) {
  69. a <- msg
  70. }(c)
  71. }
  72. }
  73. }()
  74. return http.ListenAndServe(s.Port, nil)
  75. }
  76. func (s *Server) Log(msg string) {
  77. go func() { s.Msg <- msg }()
  78. }
  79. func (s *Server) Logf(format string, a ...interface{}) {
  80. s.Log(fmt.Sprintf(format, a...))
  81. }
  82. var DefaultServer = NewServer()
  83. var DefaultClient = NewClient()
  84. func ListenAndServe() error {
  85. return DefaultServer.ListenAndServe()
  86. }
  87. func ConnectAndListen() error {
  88. return DefaultClient.ConnectAndListen()
  89. }
  90. func Log(msg string) {
  91. DefaultServer.Log(msg)
  92. }
  93. func Logf(format string, a ...interface{}) {
  94. DefaultServer.Logf(format, a...)
  95. }