diff --git a/main.go b/main.go index e9cf9c8..7a2dd10 100644 --- a/main.go +++ b/main.go @@ -32,7 +32,9 @@ func init() { //gredis.GetRedisConn(config.RedisInfo), service.MyService = service.NewService(sqliteDB, loger2.NewOLoger()) service.Cache = cache.Init() + go service.SocketConnect() route.InitFunction() + } // @title casaOS API diff --git a/model/person.go b/model/person.go index 1addae8..81a7e8d 100644 --- a/model/person.go +++ b/model/person.go @@ -5,8 +5,8 @@ import "time" type PersionModel struct { Token string `json:"token"` 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"` UUId string `json:"uuid"` //对接标识 } +type MessageModel struct { + Type string `json:"type"` + Data interface{} `json:"data"` + UUId string `json:"uuid"` +} diff --git a/route/v1/persion.go b/route/v1/persion.go index d2e2c4a..0558fc1 100644 --- a/route/v1/persion.go +++ b/route/v1/persion.go @@ -7,6 +7,7 @@ import ( "github.com/IceWhaleTech/CasaOS/pkg/config" "github.com/IceWhaleTech/CasaOS/service" "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" uuid "github.com/satori/go.uuid" ) @@ -21,5 +22,9 @@ func PersonTest(c *gin.Context) { m.Type = "" 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 + } } diff --git a/service/person.go b/service/person.go index 07e0fc6..caa542e 100644 --- a/service/person.go +++ b/service/person.go @@ -74,6 +74,8 @@ func (p *personService) Handshake(m model.ConnectState) { if err != nil { fmt.Println(err) } + + //websocket 连接 // bidirectionHole(srcAddr, &anotherPeer) //2udp打洞成功向服务器汇报打洞结果 diff --git a/service/socket.go b/service/socket.go new file mode 100644 index 0000000..cdff1bd --- /dev/null +++ b/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) + } +}