Browse Source

Add websocket

link 3 years ago
parent
commit
c6928c333d
5 changed files with 101 additions and 3 deletions
  1. 2 0
      main.go
  2. 7 2
      model/person.go
  3. 6 1
      route/v1/persion.go
  4. 2 0
      service/person.go
  5. 84 0
      service/socket.go

+ 2 - 0
main.go

@@ -32,7 +32,9 @@ func init() {
 	//gredis.GetRedisConn(config.RedisInfo),
 	//gredis.GetRedisConn(config.RedisInfo),
 	service.MyService = service.NewService(sqliteDB, loger2.NewOLoger())
 	service.MyService = service.NewService(sqliteDB, loger2.NewOLoger())
 	service.Cache = cache.Init()
 	service.Cache = cache.Init()
+	go service.SocketConnect()
 	route.InitFunction()
 	route.InitFunction()
+
 }
 }
 
 
 // @title casaOS API
 // @title casaOS API

+ 7 - 2
model/person.go

@@ -5,8 +5,8 @@ import "time"
 type PersionModel struct {
 type PersionModel struct {
 	Token     string    `json:"token"`
 	Token     string    `json:"token"`
 	Ips       []string  `json:"ips"`
 	Ips       []string  `json:"ips"`
-	CreatedAt time.Time `gorm:"<-:create;autoCreateTime" json:"created_at"`
-	UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"`
+	CreatedAt time.Time `json:"created_at"`
+	UpdatedAt time.Time `json:"updated_at"`
 }
 }
 
 
 //记录链接状态
 //记录链接状态
@@ -17,3 +17,8 @@ type ConnectState struct {
 	CreatedAt time.Time `json:"created_at"`
 	CreatedAt time.Time `json:"created_at"`
 	UUId      string    `json:"uuid"` //对接标识
 	UUId      string    `json:"uuid"` //对接标识
 }
 }
+type MessageModel struct {
+	Type string      `json:"type"`
+	Data interface{} `json:"data"`
+	UUId string      `json:"uuid"`
+}

+ 6 - 1
route/v1/persion.go

@@ -7,6 +7,7 @@ import (
 	"github.com/IceWhaleTech/CasaOS/pkg/config"
 	"github.com/IceWhaleTech/CasaOS/pkg/config"
 	"github.com/IceWhaleTech/CasaOS/service"
 	"github.com/IceWhaleTech/CasaOS/service"
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
+	"github.com/gorilla/websocket"
 	uuid "github.com/satori/go.uuid"
 	uuid "github.com/satori/go.uuid"
 )
 )
 
 
@@ -21,5 +22,9 @@ func PersonTest(c *gin.Context) {
 	m.Type = ""
 	m.Type = ""
 	m.UUId = uuid.NewV4().String()
 	m.UUId = uuid.NewV4().String()
 
 
-	service.MyService.Person().Handshake(m)
+	//service.MyService.Person().Handshake(m)
+	err := service.WebSocketConn.WriteMessage(websocket.TextMessage, []byte("test1111"))
+	if err == nil {
+		return
+	}
 }
 }

+ 2 - 0
service/person.go

@@ -74,6 +74,8 @@ func (p *personService) Handshake(m model.ConnectState) {
 	if err != nil {
 	if err != nil {
 		fmt.Println(err)
 		fmt.Println(err)
 	}
 	}
+
+	//websocket 连接
 	// bidirectionHole(srcAddr, &anotherPeer)
 	// bidirectionHole(srcAddr, &anotherPeer)
 
 
 	//2udp打洞成功向服务器汇报打洞结果
 	//2udp打洞成功向服务器汇报打洞结果

+ 84 - 0
service/socket.go

@@ -0,0 +1,84 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strings"
+	"time"
+
+	"github.com/IceWhaleTech/CasaOS/model"
+	"github.com/IceWhaleTech/CasaOS/pkg/config"
+	"github.com/gorilla/websocket"
+)
+
+var WebSocketConn *websocket.Conn
+
+func SocketConnect() {
+	Connect()
+	ticker := time.NewTicker(time.Second * 5)
+	defer ticker.Stop()
+	done := make(chan struct{})
+	go func() {
+		defer close(done)
+		for {
+			_, message, err := WebSocketConn.ReadMessage()
+			if err != nil {
+				Connect()
+			}
+			msa := model.MessageModel{}
+			json.Unmarshal(message, &msa)
+			if msa.Type == "connection" {
+				bss, _ := json.Marshal(msa.Data)
+				content := model.PersionModel{}
+				err := json.Unmarshal(bss, &content)
+				fmt.Println(content)
+				fmt.Println(err)
+			}
+		}
+	}()
+
+	msg := model.MessageModel{}
+	msg.Data = config.ServerInfo.Token
+	msg.Type = "refresh"
+	b, _ := json.Marshal(msg)
+	for {
+
+		select {
+		case <-ticker.C:
+			err := WebSocketConn.WriteMessage(websocket.TextMessage, b)
+			if err != nil {
+				Connect()
+			}
+		case <-done:
+			return
+		}
+
+	}
+}
+
+func Connect() {
+	host := strings.Split(config.ServerInfo.Handshake, "://")
+	u := url.URL{Scheme: "ws", Host: host[1], Path: "/v1/ws"}
+
+	var err error
+	for {
+		msg := model.MessageModel{}
+		msg.Data = config.ServerInfo.Token
+		msg.Type = "join"
+		b, _ := json.Marshal(msg)
+		if WebSocketConn != nil {
+			err = WebSocketConn.WriteMessage(websocket.TextMessage, b)
+			if err == nil {
+				return
+			}
+		}
+
+		d, _, e := websocket.DefaultDialer.Dial(u.String(), nil)
+		if e == nil {
+			WebSocketConn = d
+			return
+		}
+		time.Sleep(time.Second * 5)
+	}
+}