socket.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/url"
  6. "strings"
  7. "time"
  8. "github.com/IceWhaleTech/CasaOS/model"
  9. "github.com/IceWhaleTech/CasaOS/pkg/config"
  10. "github.com/gorilla/websocket"
  11. )
  12. var WebSocketConn *websocket.Conn
  13. func SocketConnect() {
  14. Connect()
  15. ticker := time.NewTicker(time.Second * 5)
  16. defer ticker.Stop()
  17. done := make(chan struct{})
  18. go func() {
  19. defer close(done)
  20. for {
  21. _, message, err := WebSocketConn.ReadMessage()
  22. if err != nil {
  23. Connect()
  24. }
  25. msa := model.MessageModel{}
  26. json.Unmarshal(message, &msa)
  27. if msa.Type == "connection" {
  28. bss, _ := json.Marshal(msa.Data)
  29. content := model.PersionModel{}
  30. err := json.Unmarshal(bss, &content)
  31. fmt.Println(content)
  32. fmt.Println(err)
  33. //开始尝试udp链接
  34. go UDPConnect(content.Ips)
  35. }
  36. }
  37. }()
  38. msg := model.MessageModel{}
  39. msg.Data = config.ServerInfo.Token
  40. msg.Type = "refresh"
  41. msg.From = config.ServerInfo.Token
  42. b, _ := json.Marshal(msg)
  43. for {
  44. select {
  45. case <-ticker.C:
  46. err := WebSocketConn.WriteMessage(websocket.TextMessage, b)
  47. if err != nil {
  48. Connect()
  49. }
  50. case <-done:
  51. return
  52. }
  53. }
  54. }
  55. func Connect() {
  56. host := strings.Split(config.ServerInfo.Handshake, "://")
  57. u := url.URL{Scheme: "ws", Host: host[1], Path: "/v1/ws"}
  58. for {
  59. d, _, e := websocket.DefaultDialer.Dial(u.String(), nil)
  60. if e == nil {
  61. WebSocketConn = d
  62. return
  63. }
  64. time.Sleep(time.Second * 5)
  65. }
  66. }