engine.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package core
  2. import (
  3. "JsRpc/config"
  4. "encoding/json"
  5. "fmt"
  6. "math/rand"
  7. "time"
  8. )
  9. // GQueryFunc 发送请求到客户端
  10. func (c *Clients) GQueryFunc(funcName string, param string, resChan chan<- string) {
  11. WriteData := Message{Param: param, Action: funcName}
  12. data, _ := json.Marshal(WriteData)
  13. clientWs := c.clientWs
  14. if c.actionData[funcName] == nil {
  15. c.actionData[funcName] = make(chan string, 1) //此次action初始化1个消息
  16. }
  17. gm.Lock()
  18. err := clientWs.WriteMessage(1, data)
  19. gm.Unlock()
  20. if err != nil {
  21. fmt.Println(err, "写入数据失败")
  22. }
  23. resultFlag := false
  24. for i := 0; i < config.DefaultTimeout*10; i++ {
  25. if len(c.actionData[funcName]) > 0 {
  26. res := <-c.actionData[funcName]
  27. resChan <- res
  28. resultFlag = true
  29. break
  30. }
  31. time.Sleep(time.Millisecond * 100)
  32. }
  33. // 循环完了还是没有数据,那就超时退出
  34. if true != resultFlag {
  35. resChan <- "黑脸怪:timeout"
  36. }
  37. defer func() {
  38. close(resChan)
  39. }()
  40. }
  41. func getRandomClient(group string, clientId string) *Clients {
  42. var client *Clients
  43. // 不传递clientId时候,从group分组随便拿一个
  44. if clientId != "" {
  45. clientName, ok := hlSyncMap.Load(group + "->" + clientId)
  46. if ok == false {
  47. return nil
  48. }
  49. client, _ = clientName.(*Clients)
  50. return client
  51. }
  52. groupClients := make([]*Clients, 0)
  53. //循环读取syncMap 获取group名字的
  54. hlSyncMap.Range(func(_, value interface{}) bool {
  55. tmpClients, ok := value.(*Clients)
  56. if !ok {
  57. return true
  58. }
  59. if tmpClients.clientGroup == group {
  60. groupClients = append(groupClients, tmpClients)
  61. }
  62. return true
  63. })
  64. if len(groupClients) == 0 {
  65. return nil
  66. }
  67. // 使用随机数发生器
  68. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  69. randomIndex := r.Intn(len(groupClients))
  70. client = groupClients[randomIndex]
  71. return client
  72. }