Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.80 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "encoding/json"
  6. "fmt"
  7. "log"
  8. "net"
  9. "time"
  10. )
  11.  
  12. type Server struct {
  13. URL string
  14. Port int
  15. }
  16.  
  17. type Client struct {
  18. Address string
  19. conn net.Conn
  20. bufRW *bufio.ReadWriter
  21. }
  22.  
  23. type ConversationID int
  24.  
  25. const (
  26. ConversationOne ConversationID = iota + 1
  27. ConversationTwo
  28. ConversationThree
  29. ConversationEnd
  30. )
  31.  
  32. type Msg struct {
  33. ID ConversationID `json:"ID"`
  34. Body string `json:"Body"`
  35. }
  36.  
  37. var serverMsg map[ConversationID]string
  38. var clientMsg map[ConversationID]string
  39.  
  40. func init() {
  41. serverMsg = make(map[ConversationID]string)
  42. serverMsg[ConversationOne] = "吃了没,您呐?"
  43. serverMsg[ConversationThree] = "嗨,没事儿溜溜弯儿。"
  44. serverMsg[ConversationEnd] = "回头去给老太太请安!"
  45. clientMsg = make(map[ConversationID]string)
  46. clientMsg[ConversationOne] = "开场"
  47. clientMsg[ConversationTwo] = "刚吃。"
  48. clientMsg[ConversationThree] = "您这,嘛去?"
  49. clientMsg[ConversationEnd] = "有空家里坐坐啊"
  50. }
  51.  
  52. func (s *Server) Listen() error {
  53. address := fmt.Sprintf("%s:%d", s.URL, s.Port)
  54. tcpAddr, _ := net.ResolveTCPAddr("tcp", address)
  55. ln, err := net.ListenTCP("tcp", tcpAddr)
  56. if err != nil {
  57. log.Printf("server: failed to listen %s, err: %s", address, err)
  58. return err
  59. }
  60. for {
  61. conn, err := ln.AcceptTCP()
  62. if err != nil {
  63. log.Printf("server: failed to connect %s, err: %s", address, err)
  64. return err
  65. }
  66. go s.msgHandler(conn)
  67. }
  68. }
  69.  
  70. func (s *Server) msgHandler(conn net.Conn) {
  71. rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn))
  72. for {
  73. buf, err := rw.ReadBytes('\n')
  74. if err != nil {
  75. log.Printf("server: client disconnect")
  76. conn.Close()
  77. return
  78. }
  79. msg := Msg{}
  80. err = json.Unmarshal(buf, &msg)
  81. if err != nil {
  82. log.Println("server: json unmarshal failed")
  83. continue
  84. }
  85.  
  86. // log.Println("client: ", msg.Body)
  87. if res, ok := serverMsg[msg.ID]; ok {
  88. replyMsg := Msg{
  89. ID: msg.ID,
  90. Body: res,
  91. }
  92. replyBytes, err := json.Marshal(&replyMsg)
  93. replyBytes = append(replyBytes, []byte("\n")...)
  94. if err != nil {
  95. log.Println("server: json marshal failed, err: ", err)
  96. continue
  97. }
  98. rw.Write(replyBytes)
  99. rw.Flush()
  100. } else {
  101. continue
  102. }
  103. }
  104. }
  105.  
  106. func (c *Client) Connect() (err error) {
  107. c.conn, err = net.Dial("tcp", c.Address)
  108. if err != nil {
  109. log.Printf("client: connect to %s failed", c.Address)
  110. return err
  111. }
  112. c.bufRW = bufio.NewReadWriter(bufio.NewReader(c.conn), bufio.NewWriter(c.conn))
  113. return nil
  114. }
  115.  
  116. func (c *Client) SendMsg() {
  117. curID := ConversationOne
  118. for curID <= ConversationEnd {
  119. body := ""
  120. if res, ok := clientMsg[curID]; ok {
  121. body = res
  122. } else {
  123. log.Println("not found msg, id: ", curID)
  124. return
  125. }
  126. msg := Msg{
  127. ID: curID,
  128. Body: body,
  129. }
  130. msgBytes, err := json.Marshal(&msg)
  131. if err != nil {
  132. log.Println("client: json marshal failed, err: ", err)
  133. return
  134. }
  135. msgBytes = append(msgBytes, []byte("\n")...)
  136. _, err = c.bufRW.Write(msgBytes)
  137. if err != nil {
  138. fmt.Println("write failed, err: ", err)
  139. continue
  140. }
  141. c.bufRW.Flush()
  142. if curID == ConversationTwo {
  143. curID++
  144. continue
  145. }
  146. replyBytes, _ := c.bufRW.ReadBytes('\n')
  147. replyMsg := Msg{}
  148. if err := json.Unmarshal(replyBytes, &replyMsg); err != nil {
  149. log.Println("client: json unmarshal failed, err: ", err)
  150. return
  151. }
  152. // log.Println("server: ", replyMsg.Body)
  153. curID++
  154. }
  155. }
  156.  
  157. func (c *Client) Stop() {
  158. c.conn.Close()
  159. }
  160.  
  161. func main() {
  162. s := Server{
  163. URL: "127.0.0.1",
  164. Port: 8000,
  165. }
  166. go func() {
  167. if err := s.Listen(); err != nil {
  168. panic(err)
  169. }
  170. }()
  171. time.Sleep(2 * time.Second)
  172. c := Client{
  173. Address: "127.0.0.1:8000",
  174. }
  175. if err := c.Connect(); err != nil {
  176. panic(err)
  177. }
  178. go func() {
  179. defer c.Stop()
  180. start := time.Now()
  181. for i := 0; i < 100000; i++ {
  182. c.SendMsg()
  183. }
  184. elapse := time.Since(start)
  185. log.Println("total spend: ", elapse)
  186. }()
  187. <-(chan int)(nil)
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement