Ver código fonte

Update main.go

hliang 3 anos atrás
pai
commit
9a6f9c8ed9
1 arquivos alterados com 46 adições e 61 exclusões
  1. 46 61
      main.go

+ 46 - 61
main.go

@@ -12,7 +12,6 @@ import (
 	"time"
 )
 
-
 var (
 	// BasicPort The original port without SSL certificate
 	BasicPort = `:12080`
@@ -24,9 +23,11 @@ var (
 		CheckOrigin: func(r *http.Request) bool { return true },
 	}
 	hlSyncMap sync.Map
+
+	// OverTime 设置接口没得到结果时的超时时间
+	OverTime = time.Second * 30
 )
 
-// Clients provides Connect instance for a job
 type Clients struct {
 	clientGroup string
 	clientName  string
@@ -35,16 +36,6 @@ type Clients struct {
 }
 
 // NewClients initializes a new Clients instance
-func NewClients(clientGroup string, clientName string, clientWs *websocket.Conn) *Clients {
-	return &Clients{
-		clientGroup: clientGroup,
-		clientName:  clientName,
-		clientWs:    clientWs,
-	}
-}
-
-var hlClients sync.Map
-
 func NewClient(group string, name string, ws *websocket.Conn) *Clients {
 	return &Clients{
 		clientGroup: group,
@@ -65,9 +56,10 @@ func ws(c *gin.Context) {
 		fmt.Println("websocket err:", err)
 		return
 	}
-	client := NewClients(group, name, ws)
+	client := NewClient(group, name, ws)
 	hlSyncMap.Store(group+"->"+name, client)
 	for {
+		//等待数据
 		_, message, err := ws.ReadMessage()
 		if err != nil {
 			break
@@ -77,11 +69,9 @@ func ws(c *gin.Context) {
 		strIndex := strings.Index(msg, string(check))
 		if strIndex >= 1 {
 			action := msg[:strIndex]
-
-
 			client.Data[action] = msg[strIndex+5:]
 			fmt.Println("get_message:", client.Data[action])
-			hlClients.Store(getGroup+"->"+getName, client)
+			hlSyncMap.Store(group+"->"+name, client)
 		} else {
 			fmt.Println(msg, "message error")
 		}
@@ -108,63 +98,57 @@ func QueryFunc(client *Clients, funcName string, param string) {
 
 }
 
-func Go(c *gin.Context) {
+func ResultSet(c *gin.Context) {
 	getGroup, getName, Action, getParam := c.Query("group"), c.Query("name"), c.Query("action"), c.Query("param")
 	if getGroup == "" || getName == "" {
 		c.String(200, "input group and name")
 		return
 	}
-	clientName, ok := hlClients.Load(getGroup + "->" + getName)
-=======
-	hlSyncMap.Delete(group + "->" + name)
-	defer ws.Close()
-}
-
-// ResultSet provides get result function for a job
-// you can use it to Remote operation and get results
-func ResultSet(c *gin.Context) {
-	group := c.Query("group")
-	name := c.Query("name")
-	action := c.Query("action")
-	param := c.Query("param")
-
-	if group == "" || name == "" {
-		c.String(200, "input group and name")
-		return
-	}
-	fmt.Println(group + "->" + name)
-	clientName, ok := hlSyncMap.Load(group + "->" + name)
-	fmt.Println(clientName)
+	clientName, ok := hlSyncMap.Load(getGroup + "->" + getName)
 	if ok == false {
 		c.String(200, "注入了ws?没有找到当前组和名字")
 		return
 	}
-	if action == "" {
-		c.JSON(200, gin.H{"group": group, "name": name})
+	if Action == "" {
+		c.JSON(200, gin.H{"group": getGroup, "name": getName})
 		return
 	}
-
-	value, ko := clientName.(*Clients)
-	if value.Data[action] == nil {
-		value.Data[action] = make(chan string, 1)
+	//取一个ws客户端
+	client, ko := clientName.(*Clients)
+	if !ko {
+		return
 	}
-	QueryFunc(value, action, param)
-	data := <-value.Data[action]
+	//发送数据到web里得到结果
+	QueryFunc(client, Action, getParam)
 
-	if ko {
-		c.JSON(200, gin.H{"status": "200", "group": value.clientGroup, "name": value.clientName, action: data})
-	} else {
-		c.JSON(666, gin.H{"message": "?"})
+	ctx, cancel := context.WithTimeout(context.Background(), OverTime)
+	for {
+		select {
+		case <-ctx.Done():
+			// 获取数据超时了
+			cancel()
+			return
+		default:
+			data := client.Data[Action]
+			//fmt.Println("正常中")
+			if data != "" {
+				cancel()
+				//这里设置为空是为了清除上次的结果并且赋值判断
+				client.Data[Action] = ""
+				c.JSON(200, gin.H{"status": "200", "group": client.clientGroup, "name": client.clientName, Action: data})
+			} else {
+				time.Sleep(time.Millisecond * 500)
+			}
+		}
 	}
 
 }
 
-// ClientConnectionList provides get client connect list for a job
-// you can use it see all Connection
-func ClientConnectionList(c *gin.Context) {
+func getList(c *gin.Context) {
 	resList := "hliang:\r\n"
 	hlSyncMap.Range(func(key, value interface{}) bool {
 		resList += key.(string) + "\r\n\t"
+
 		return true
 	})
 	c.String(200, resList)
@@ -190,14 +174,15 @@ func TlsHandler() gin.HandlerFunc {
 }
 
 func main() {
-	//设置获取数据的超时时间30秒
 	r := gin.Default()
-	r.GET("/result", ResultSet)
+	r.GET("/", Index)
+	r.GET("/go", ResultSet)
 	r.GET("/ws", ws)
-	r.GET("/list", ClientConnectionList)
-	r.Use(TlsHandler())
-	_ = r.Run(LocalPort)
-	//_ = r.RunTLS(sslPort, "zhengshu.pem", "zhengshu.key")
-	r.Run(BasicPort)
-	//r.RunTLS(SSLPort, "zhengshu.pem", "zhengshu.key")
+	r.GET("/list", getList)
+	_ = r.Run(BasicPort)
+
+	//编译https版放开下面两行注释代码 并且把上一行注释
+	//r.Use(TlsHandler())
+	//_ = r.RunTLS(SSLPort, "zhengshu.pem", "zhengshu.key")
+
 }