main.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package main
  2. // Start Commond eg: ./client 1 5000 localhost:8080
  3. // first parameter:beginning userId
  4. // second parameter: amount of clients
  5. // third parameter: comet server ip
  6. import (
  7. "flag"
  8. "fmt"
  9. "log"
  10. "math/rand"
  11. "net"
  12. "os"
  13. "runtime"
  14. "strconv"
  15. "time"
  16. "go-common/app/service/main/broadcast/libs/bufio"
  17. "go-common/app/service/main/broadcast/model"
  18. )
  19. var (
  20. lg *log.Logger
  21. )
  22. const (
  23. _heartTime = 10 * time.Second
  24. )
  25. func main() {
  26. runtime.GOMAXPROCS(runtime.NumCPU())
  27. _, err := os.OpenFile("./client.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
  28. if err != nil {
  29. panic(err)
  30. }
  31. lg = log.New(os.Stdout, "", log.LstdFlags|log.Lshortfile)
  32. flag.Parse()
  33. begin, err := strconv.Atoi(os.Args[1])
  34. if err != nil {
  35. panic(err)
  36. }
  37. num, err := strconv.Atoi(os.Args[2])
  38. if err != nil {
  39. panic(err)
  40. }
  41. for i := begin; i < begin+num; i++ {
  42. go client(fmt.Sprintf("%d", i))
  43. }
  44. var exit chan bool
  45. <-exit
  46. }
  47. func client(key string) {
  48. time.Sleep(time.Duration(rand.Intn(5000)) * time.Microsecond)
  49. for {
  50. conn, err := net.DialTimeout("tcp", os.Args[3], time.Second)
  51. if err != nil {
  52. lg.Printf("err.net.Dial(%s) error(%v)\n", os.Args[3], err)
  53. return
  54. }
  55. defer func() {
  56. conn.Close()
  57. lg.Printf("err.conn.Close() key:%s", key)
  58. }()
  59. wr := bufio.NewWriter(conn)
  60. rd := bufio.NewReader(conn)
  61. // timeout
  62. if err = conn.SetDeadline(time.Now().Add(time.Second * 5)); err != nil {
  63. lg.Printf("err.conn.SetDeadline() error(%v)\n", err)
  64. return
  65. }
  66. body := fmt.Sprintf(`{"device_id":"1231231","access_key":"test","platform":"android","mobi_app":"android","build":50000,"accepts":[10001]}`)
  67. fmt.Println(body)
  68. // auth first
  69. proto := &model.Proto{
  70. Operation: model.OpAuth,
  71. Body: []byte(body),
  72. }
  73. if err = proto.WriteTCP(wr); err != nil {
  74. lg.Printf("err.auth write error(%v)\n", err)
  75. return
  76. }
  77. if err = wr.Flush(); err != nil {
  78. lg.Printf("err.auth flush error(%v)\n", err)
  79. return
  80. }
  81. go heartbeat(conn, wr, key)
  82. for {
  83. if err = proto.ReadTCP(rd); err != nil {
  84. lg.Printf("err.read a proto key:%v error(%v)\n", key, err)
  85. return
  86. }
  87. switch proto.Operation {
  88. case model.OpHeartbeatReply:
  89. if err = conn.SetDeadline(time.Now().Add(_heartTime * 5)); err != nil {
  90. lg.Printf("err.conn.SetDeadline() key:%v error(%v)\n", key, err)
  91. return
  92. }
  93. lg.Printf("info.read key:%v heartbeat proto.body(%s) seq: %d\n", key, string(proto.Body), proto.SeqId)
  94. default:
  95. lg.Printf("info.read a key:%v proto(%+v) op:%d\n", key, proto, proto.Operation)
  96. }
  97. }
  98. }
  99. }
  100. func heartbeat(conn net.Conn, wr *bufio.Writer, key string) {
  101. var (
  102. a int32
  103. err error
  104. )
  105. defer conn.Close()
  106. for {
  107. a++
  108. proto := &model.Proto{
  109. Operation: model.OpHeartbeat,
  110. SeqId: a,
  111. }
  112. if err = proto.WriteTCP(wr); err != nil {
  113. lg.Printf("err.heartbeat write error(%v)\n", err)
  114. return
  115. }
  116. if err = wr.Flush(); err != nil {
  117. lg.Printf("err.heartbeat key:%s flush error(%v)\n", key, err)
  118. return
  119. }
  120. lg.Printf("info.write key:%s heartbeat proto(%+v)\n", key, proto)
  121. a++
  122. // op := ChangeRoomReq{
  123. // RoomID: "test://2233",
  124. // }
  125. // body, err := json.Marshal(op)
  126. // if err != nil {
  127. // panic(err)
  128. // }
  129. // proto = &model.Proto{
  130. // Operation: model.OpChangeRoom,
  131. // SeqId: a,
  132. // Body: body,
  133. // }
  134. // if err = proto.WriteTCP(wr); err != nil {
  135. // lg.Printf("err.heartbeat write error(%v)\n", err)
  136. // return
  137. // }
  138. // if err = wr.Flush(); err != nil {
  139. // lg.Printf("err.heartbeat key:%s flush error(%v)\n", key, err)
  140. // return
  141. // }
  142. // lg.Printf("info.write key:%s heartbeat proto(%+v)\n", key, proto)
  143. time.Sleep(_heartTime)
  144. }
  145. }