main.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "github.com/gorilla/websocket"
  7. "github.com/unrolled/secure"
  8. "net/http"
  9. "os"
  10. "strings"
  11. "sync"
  12. )
  13. var (
  14. // BasicPort The original port without SSL certificate
  15. BasicPort = `:12080`
  16. // SSLPort "Secure" port with SSL certificate
  17. SSLPort = `:12443`
  18. // websocket.Upgrader specifies parameters for upgrading an HTTP connection to a
  19. // WebSocket connection.
  20. upGrader = websocket.Upgrader{
  21. CheckOrigin: func(r *http.Request) bool { return true },
  22. }
  23. hlSyncMap sync.Map
  24. gm = &sync.Mutex{}
  25. gchan, isPrint = make(chan string), false
  26. )
  27. type Clients struct {
  28. clientGroup string
  29. clientName string
  30. Data map[string]string
  31. clientWs *websocket.Conn
  32. }
  33. type Message struct {
  34. Action string `json:"action"`
  35. Param string `json:"param"`
  36. }
  37. // is print?
  38. func logPrint(p ...interface{}) {
  39. if isPrint {
  40. fmt.Println(p)
  41. }
  42. }
  43. // NewClient initializes a new Clients instance
  44. func NewClient(group string, name string, ws *websocket.Conn) *Clients {
  45. return &Clients{
  46. clientGroup: group,
  47. clientName: name,
  48. Data: make(map[string]string),
  49. clientWs: ws,
  50. }
  51. }
  52. // ws, provides inject function for a job
  53. func ws(c *gin.Context) {
  54. group, name := c.Query("group"), c.Query("name")
  55. if group == "" || name == "" {
  56. return
  57. }
  58. ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
  59. if err != nil {
  60. fmt.Println("websocket err:", err)
  61. return
  62. }
  63. client := NewClient(group, name, ws)
  64. hlSyncMap.Store(group+"->"+name, client)
  65. for {
  66. //等待数据
  67. _, message, err := ws.ReadMessage()
  68. if err != nil {
  69. break
  70. }
  71. msg := string(message)
  72. check := []uint8{104, 108, 94, 95, 94}
  73. strIndex := strings.Index(msg, string(check))
  74. if strIndex >= 1 {
  75. action := msg[:strIndex]
  76. client.Data[action] = msg[strIndex+5:]
  77. logPrint("get_message:", client.Data[action])
  78. gchan <- msg[strIndex+5:]
  79. hlSyncMap.Store(group+"->"+name, client)
  80. } else {
  81. fmt.Println(msg, "message error")
  82. }
  83. }
  84. defer func(ws *websocket.Conn) {
  85. _ = ws.Close()
  86. logPrint(group+"->"+name, "下线了")
  87. hlSyncMap.Range(func(key, value interface{}) bool {
  88. //client, _ := value.(*Clients)
  89. if key == group+"->"+name {
  90. hlSyncMap.Delete(key)
  91. }
  92. return true
  93. })
  94. }(ws)
  95. }
  96. func wsTest(c *gin.Context) {
  97. testClient, _ := upGrader.Upgrade(c.Writer, c.Request, nil)
  98. for {
  99. //等待数据
  100. _, message, err := testClient.ReadMessage()
  101. if err != nil {
  102. break
  103. }
  104. msg := string(message)
  105. logPrint("接收到测试消息", msg)
  106. _ = testClient.WriteMessage(1, []byte(msg))
  107. }
  108. defer func(ws *websocket.Conn) {
  109. _ = ws.Close()
  110. }(testClient)
  111. }
  112. func GQueryFunc(client *Clients, funcName string, param string, resChan chan<- string) {
  113. WriteDate := Message{}
  114. WriteDate.Action = funcName
  115. if param == "" {
  116. WriteDate.Param = ""
  117. } else {
  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. resChan <- res
  130. }
  131. func ResultSet(c *gin.Context) {
  132. var getGroup, getName, Action, Param string
  133. //获取参数
  134. getGroup, getName, Action, Param = c.Query("group"), c.Query("name"), c.Query("action"), c.Query("param")
  135. //如果获取不到 说明是post提交的
  136. if getGroup == "" && getName == "" {
  137. //切换post获取方式
  138. getGroup, getName, Action, Param = c.PostForm("group"), c.PostForm("name"), c.PostForm("action"), c.PostForm("param")
  139. }
  140. if getGroup == "" || getName == "" {
  141. c.JSON(400, gin.H{"status": 400, "data": "input group and name"})
  142. return
  143. }
  144. clientName, ok := hlSyncMap.Load(getGroup + "->" + getName)
  145. if ok == false {
  146. c.JSON(400, gin.H{"status": 400, "data": "注入了ws?没有找到当前组和名字"})
  147. return
  148. }
  149. if Action == "" {
  150. c.JSON(200, gin.H{"group": getGroup, "name": getName})
  151. return
  152. }
  153. //取一个ws客户端
  154. client, ko := clientName.(*Clients)
  155. if !ko {
  156. return
  157. }
  158. c2 := make(chan string)
  159. go GQueryFunc(client, Action, Param, c2)
  160. //把管道传过去,获得值就返回了
  161. c.JSON(200, gin.H{"status": 200, "group": client.clientGroup, "name": client.clientName, "data": <-c2})
  162. }
  163. func Execjs(c *gin.Context) {
  164. var getGroup, getName, JsCode string
  165. Action := "_execjs"
  166. //获取参数
  167. getGroup, getName, JsCode = c.Query("group"), c.Query("name"), c.Query("jscode")
  168. //如果获取不到 说明是post提交的
  169. if getGroup == "" && getName == "" {
  170. //切换post获取方式
  171. getGroup, getName, JsCode = c.PostForm("group"), c.PostForm("name"), c.PostForm("jscode")
  172. }
  173. if getGroup == "" || getName == "" {
  174. c.JSON(400, gin.H{"status": 400, "data": "input group and name"})
  175. return
  176. }
  177. logPrint(getGroup, getName, JsCode)
  178. clientName, ok := hlSyncMap.Load(getGroup + "->" + getName)
  179. if ok == false {
  180. c.JSON(400, gin.H{"status": 400, "data": "注入了ws?没有找到当前组和名字"})
  181. return
  182. }
  183. //取一个ws客户端
  184. client, ko := clientName.(*Clients)
  185. if !ko {
  186. return
  187. }
  188. c2 := make(chan string)
  189. go GQueryFunc(client, Action, JsCode, c2)
  190. c.JSON(200, gin.H{"status": "200", "group": client.clientGroup, "name": client.clientName, "data": <-c2})
  191. }
  192. func getList(c *gin.Context) {
  193. resList := "黑脸怪:\r\n\t"
  194. hlSyncMap.Range(func(key, value interface{}) bool {
  195. resList += key.(string) + "\r\n\t"
  196. return true
  197. })
  198. c.String(200, resList)
  199. }
  200. func Index(c *gin.Context) {
  201. c.String(200, "你好,我是黑脸怪~")
  202. }
  203. func TlsHandler() gin.HandlerFunc {
  204. return func(c *gin.Context) {
  205. secureMiddleware := secure.New(secure.Options{
  206. SSLRedirect: true,
  207. SSLHost: SSLPort,
  208. })
  209. err := secureMiddleware.Process(c.Writer, c.Request)
  210. if err != nil {
  211. c.Abort()
  212. return
  213. }
  214. c.Next()
  215. }
  216. }
  217. func main() {
  218. for _, v := range os.Args {
  219. if v == "log" {
  220. isPrint = true
  221. }
  222. }
  223. r := gin.Default()
  224. r.GET("/", Index)
  225. r.GET("/go", ResultSet)
  226. r.POST("/go", ResultSet)
  227. r.GET("/ws", ws)
  228. r.GET("/wst", wsTest)
  229. r.GET("/execjs", Execjs)
  230. r.POST("/execjs", Execjs)
  231. r.GET("/list", getList)
  232. r.Use(TlsHandler())
  233. _ = r.Run(BasicPort)
  234. //编译https版放开下面这行注释代码 并且把上一行注释
  235. //_ = r.RunTLS(SSLPort, "zhengshu.pem", "zhengshu.key")
  236. }