You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
2.7 KiB

  1. package znet
  2. import (
  3. "fmt"
  4. "github.com/aceld/zinx/ziface"
  5. "io"
  6. "net"
  7. "testing"
  8. "time"
  9. )
  10. // run in terminal:
  11. // go test -v ./znet -run=TestServer
  12. /*
  13. 模拟客户端
  14. */
  15. func ClientTest() {
  16. fmt.Println("Client Test ... start")
  17. //3秒之后发起测试请求,给服务端开启服务的机会
  18. time.Sleep(3 * time.Second)
  19. conn, err := net.Dial("tcp", "127.0.0.1:8999")
  20. if err != nil {
  21. fmt.Println("client start err, exit!")
  22. return
  23. }
  24. for {
  25. dp := NewDataPack()
  26. msg, _ := dp.Pack(NewMsgPackage(1, []byte("client test message")))
  27. _, err := conn.Write(msg)
  28. if err != nil {
  29. fmt.Println("client write err: ", err)
  30. return
  31. }
  32. //先读出流中的head部分
  33. headData := make([]byte, dp.GetHeadLen())
  34. _, err = io.ReadFull(conn, headData)
  35. if err != nil {
  36. fmt.Println("client read head err: ", err)
  37. return
  38. }
  39. // 将headData字节流 拆包到msg中
  40. msgHead, err := dp.Unpack(headData)
  41. if err != nil {
  42. fmt.Println("client unpack head err: ", err)
  43. return
  44. }
  45. if msgHead.GetDataLen() > 0 {
  46. //msg 是有data数据的,需要再次读取data数据
  47. msg := msgHead.(*Message)
  48. msg.Data = make([]byte, msg.GetDataLen())
  49. //根据dataLen从io中读取字节流
  50. _, err := io.ReadFull(conn, msg.Data)
  51. if err != nil {
  52. fmt.Println("client unpack data err")
  53. return
  54. }
  55. fmt.Printf("==> Client receive Msg: Id = %d, len = %d , data = %s\n", msg.Id, msg.DataLen, msg.Data)
  56. }
  57. time.Sleep(time.Second)
  58. }
  59. }
  60. /*
  61. 模拟服务器端
  62. */
  63. //ping test 自定义路由
  64. type PingRouter struct {
  65. BaseRouter
  66. }
  67. //Test PreHandle
  68. func (this *PingRouter) PreHandle(request ziface.IRequest) {
  69. fmt.Println("Call Router PreHandle")
  70. err := request.GetConnection().SendMsg(1, []byte("before ping ....\n"))
  71. if err != nil {
  72. fmt.Println("preHandle SendMsg err: ", err)
  73. }
  74. }
  75. //Test Handle
  76. func (this *PingRouter) Handle(request ziface.IRequest) {
  77. fmt.Println("Call PingRouter Handle")
  78. //先读取客户端的数据,再回写ping...ping...ping
  79. fmt.Println("recv from client : msgId=", request.GetMsgID(), ", data=", string(request.GetData()))
  80. err := request.GetConnection().SendMsg(1, []byte("ping...ping...ping\n"))
  81. if err != nil {
  82. fmt.Println("Handle SendMsg err: ", err)
  83. }
  84. }
  85. //Test PostHandle
  86. func (this *PingRouter) PostHandle(request ziface.IRequest) {
  87. fmt.Println("Call Router PostHandle")
  88. err := request.GetConnection().SendMsg(1, []byte("After ping .....\n"))
  89. if err != nil {
  90. fmt.Println("Post SendMsg err: ", err)
  91. }
  92. }
  93. func TestServer(t *testing.T) {
  94. //创建一个server句柄
  95. s := NewServer()
  96. s.AddRouter(1, &PingRouter{})
  97. // 客户端测试
  98. go ClientTest()
  99. //2 开启服务
  100. go s.Serve()
  101. select {
  102. case <-time.After(time.Second * 10):
  103. return
  104. }
  105. }