main.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package main
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/gin-gonic/gin"
  7. "github.com/gorilla/websocket"
  8. "github.com/unrolled/secure"
  9. "net/http"
  10. "strings"
  11. "sync"
  12. "time"
  13. )
  14. var (
  15. // BasicPort The original port without SSL certificate
  16. BasicPort = `:12080`
  17. // SSLPort "Secure" port with SSL certificate
  18. SSLPort = `:12443`
  19. // websocket.Upgrader specifies parameters for upgrading an HTTP connection to a
  20. // WebSocket connection.
  21. upGrader = websocket.Upgrader{
  22. CheckOrigin: func(r *http.Request) bool { return true },
  23. }
  24. hlSyncMap sync.Map
  25. gm = &sync.Mutex{}
  26. gchan = make(chan string)
  27. // OverTime 设置接口没得到结果时的超时时间
  28. OverTime = time.Second * 30
  29. )
  30. type Clients struct {
  31. clientGroup string
  32. clientName string
  33. Data map[string]string
  34. clientWs *websocket.Conn
  35. }
  36. type Message struct {
  37. Action string `json:"action"`
  38. Param string `json:"param"`
  39. }
  40. // NewClient initializes a new Clients instance
  41. func NewClient(group string, name string, ws *websocket.Conn) *Clients {
  42. return &Clients{
  43. clientGroup: group,
  44. clientName: name,
  45. Data: make(map[string]string),
  46. clientWs: ws,
  47. }
  48. }
  49. // ws, provides inject function for a job
  50. func ws(c *gin.Context) {
  51. group, name := c.Query("group"), c.Query("name")
  52. if group == "" || name == "" {
  53. return
  54. }
  55. ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
  56. if err != nil {
  57. fmt.Println("websocket err:", err)
  58. return
  59. }
  60. client := NewClient(group, name, ws)
  61. hlSyncMap.Store(group+"->"+name, client)
  62. for {
  63. //等待数据
  64. _, message, err := ws.ReadMessage()
  65. if err != nil {
  66. break
  67. }
  68. msg := string(message)
  69. check := []uint8{104, 108, 94, 95, 94}
  70. strIndex := strings.Index(msg, string(check))
  71. if strIndex >= 1 {
  72. action := msg[:strIndex]
  73. client.Data[action] = msg[strIndex+5:]
  74. fmt.Println("get_message:", client.Data[action])
  75. gchan <- msg[strIndex+5:]
  76. hlSyncMap.Store(group+"->"+name, client)
  77. } else {
  78. fmt.Println(msg, "message error")
  79. }
  80. }
  81. defer func(ws *websocket.Conn) {
  82. _ = ws.Close()
  83. hlSyncMap.Range(func(key, value interface{}) bool {
  84. client, _ := value.(*Clients)
  85. if key == client.clientGroup+"->"+client.clientName {
  86. hlSyncMap.Delete(key)
  87. return true
  88. }
  89. return false
  90. })
  91. }(ws)
  92. }
  93. func QueryFunc(client *Clients, funcName string, param string) {
  94. WriteDate := Message{}
  95. WriteDate.Action = funcName
  96. if param == "" {
  97. //WriteDate = "{\"action\":\"" + funcName + "\"}"
  98. WriteDate.Param = ""
  99. } else {
  100. //WriteDate = "{\"action\":\"" + funcName + "\",\"param\":\"" + param + "\"}"
  101. WriteDate.Param = param
  102. }
  103. data, _ := json.Marshal(WriteDate)
  104. ws := client.clientWs
  105. err := ws.WriteMessage(2, data)
  106. if err != nil {
  107. fmt.Println(err, "写入数据失败")
  108. }
  109. }
  110. func GQueryFunc(client *Clients, funcName string, param string, resChan chan <- string) {
  111. WriteDate := Message{}
  112. WriteDate.Action = funcName
  113. if param == "" {
  114. //WriteDate = "{\"action\":\"" + funcName + "\"}"
  115. WriteDate.Param = ""
  116. } else {
  117. //WriteDate = "{\"action\":\"" + funcName + "\",\"param\":\"" + param + "\"}"
  118. WriteDate.Param = param
  119. }
  120. data, _ := json.Marshal(WriteDate)
  121. ws := client.clientWs
  122. gm.Lock()
  123. err := ws.WriteMessage(2, data)
  124. gm.Unlock()
  125. if err != nil {
  126. fmt.Println(err, "写入数据失败")
  127. }
  128. res := <- gchan
  129. fmt.Printf("res: %v\n", res)
  130. resChan <- res
  131. }
  132. func ResultSet(c *gin.Context) {
  133. var getGroup, getName, Action, Param string
  134. //获取参数
  135. getGroup, getName, Action, Param = c.Query("group"), c.Query("name"), c.Query("action"), c.Query("param")
  136. //如果获取不到 说明是post提交的
  137. if getGroup == "" && getName == "" {
  138. //切换post获取方式
  139. getGroup, getName, Action, Param = c.PostForm("group"), c.PostForm("name"), c.PostForm("action"), c.PostForm("param")
  140. }
  141. //if zType == "" {
  142. // Param = strings.Replace(Param, "\"", "\\\"", -1)
  143. //}
  144. if getGroup == "" || getName == "" {
  145. c.String(200, "input group and name")
  146. return
  147. }
  148. clientName, ok := hlSyncMap.Load(getGroup + "->" + getName)
  149. if ok == false {
  150. c.String(200, "注入了ws?没有找到当前组和名字")
  151. return
  152. }
  153. if Action == "" {
  154. c.JSON(200, gin.H{"group": getGroup, "name": getName})
  155. return
  156. }
  157. //取一个ws客户端
  158. client, ko := clientName.(*Clients)
  159. if !ko {
  160. return
  161. }
  162. //发送数据到web里得到结果
  163. // QueryFunc(client, Action, Param)
  164. // ctx, cancel := context.WithTimeout(context.Background(), OverTime)
  165. // for {
  166. // select {
  167. // case <-ctx.Done():
  168. // // 获取数据超时了
  169. // cancel()
  170. // return
  171. // default:
  172. // data := client.Data[Action]
  173. // //fmt.Println("正常中")
  174. // if data != "" {
  175. // cancel()
  176. // //这里设置为空是为了清除上次的结果并且赋值判断
  177. // client.Data[Action] = ""
  178. // c.JSON(200, gin.H{"status": "200", "group": client.clientGroup, "name": client.clientName, "data": data})
  179. // } else {
  180. // time.Sleep(time.Millisecond * 500)
  181. // }
  182. // }
  183. // }
  184. c2 := make(chan string)
  185. go GQueryFunc(client, Action, Param,c2)
  186. c.JSON(200, gin.H{"status": "200", "group": client.clientGroup, "name": client.clientName, "data": <-c2})
  187. }
  188. func Execjs(c *gin.Context) {
  189. var getGroup, getName, JsCode string
  190. Action := "_execjs"
  191. //获取参数
  192. getGroup, getName, JsCode = c.Query("group"), c.Query("name"), c.Query("jscode")
  193. //如果获取不到 说明是post提交的
  194. if getGroup == "" && getName == "" {
  195. //切换post获取方式
  196. getGroup, getName, JsCode = c.PostForm("group"), c.PostForm("name"), c.PostForm("jscode")
  197. }
  198. if getGroup == "" || getName == "" {
  199. c.String(200, "input group and name")
  200. return
  201. }
  202. fmt.Println(getGroup, getName, JsCode)
  203. clientName, ok := hlSyncMap.Load(getGroup + "->" + getName)
  204. if ok == false {
  205. c.String(200, "注入了ws?没有找到组和名字")
  206. return
  207. }
  208. //取一个ws客户端
  209. client, ko := clientName.(*Clients)
  210. if !ko {
  211. return
  212. }
  213. //发送数据到web里得到结果
  214. QueryFunc(client, Action, JsCode)
  215. ctx, cancel := context.WithTimeout(context.Background(), OverTime)
  216. for {
  217. select {
  218. case <-ctx.Done():
  219. // 获取数据超时了
  220. cancel()
  221. return
  222. default:
  223. data := client.Data[Action]
  224. //fmt.Println("正常中")
  225. if data != "" {
  226. cancel()
  227. //这里设置为空是为了清除上次的结果并且赋值判断
  228. client.Data[Action] = ""
  229. c.JSON(200, gin.H{"status": "200", "group": client.clientGroup, "name": client.clientName, "data": data})
  230. } else {
  231. time.Sleep(time.Millisecond * 500)
  232. }
  233. }
  234. }
  235. }
  236. func getList(c *gin.Context) {
  237. resList := "黑脸怪:\r\n\t"
  238. hlSyncMap.Range(func(key, value interface{}) bool {
  239. resList += key.(string) + "\r\n\t"
  240. return true
  241. })
  242. c.String(200, resList)
  243. }
  244. func Index(c *gin.Context) {
  245. c.String(200, "你好,我是黑脸怪~")
  246. }
  247. func TlsHandler() gin.HandlerFunc {
  248. return func(c *gin.Context) {
  249. secureMiddleware := secure.New(secure.Options{
  250. SSLRedirect: true,
  251. SSLHost: SSLPort,
  252. })
  253. err := secureMiddleware.Process(c.Writer, c.Request)
  254. if err != nil {
  255. c.Abort()
  256. return
  257. }
  258. c.Next()
  259. }
  260. }
  261. func main() {
  262. //gin.SetMode(gin.ReleaseMode)
  263. r := gin.Default()
  264. r.GET("/", Index)
  265. r.GET("/go", ResultSet)
  266. r.POST("/go", ResultSet)
  267. r.GET("/ws", ws)
  268. r.GET("/execjs", Execjs)
  269. r.POST("/execjs", Execjs)
  270. r.GET("/list", getList)
  271. r.Use(TlsHandler())
  272. _ = r.Run(BasicPort)
  273. //编译https版放开下面这行注释代码 并且把上一行注释
  274. //_ = r.RunTLS(SSLPort, "zhengshu.pem", "zhengshu.key")
  275. }