9.5 使用Zinx-V0.9完成应用程序

    写一个服务端:

    我们这里注册了两个Hook函数一个是链接初始化之后和链接停止之前DoConnectionLost()

    DoConnectionBegin()会发给客户端一个消息2的文本,并且在服务端打印一个调试信息"DoConnecionBegin is Called … "

    客户端:

    Client.go

    1. package main
    2. import (
    3. "fmt"
    4. "io"
    5. "net"
    6. "time"
    7. "zinx/znet"
    8. )
    9. /*
    10. 模拟客户端
    11. */
    12. func main() {
    13. fmt.Println("Client Test ... start")
    14. //3秒之后发起测试请求,给服务端开启服务的机会
    15. time.Sleep(3 * time.Second)
    16. conn,err := net.Dial("tcp", "127.0.0.1:7777")
    17. if err != nil {
    18. fmt.Println("client start err, exit!")
    19. }
    20. for {
    21. //发封包message消息
    22. dp := znet.NewDataPack()
    23. msg, _ := dp.Pack(znet.NewMsgPackage(0,[]byte("Zinx V0.8 Client0 Test Message")))
    24. _, err := conn.Write(msg)
    25. if err !=nil {
    26. fmt.Println("write error err ", err)
    27. return
    28. }
    29. //先读出流中的head部分
    30. headData := make([]byte, dp.GetHeadLen())
    31. _, err = io.ReadFull(conn, headData) //ReadFull 会把msg填充满为止
    32. if err != nil {
    33. fmt.Println("read head error")
    34. break
    35. }
    36. //将headData字节流 拆包到msg中
    37. msgHead, err := dp.Unpack(headData)
    38. if err != nil {
    39. fmt.Println("server unpack err:", err)
    40. return
    41. }
    42. //msg 是有data数据的,需要再次读取data数据
    43. msg := msgHead.(*znet.Message)
    44. msg.Data = make([]byte, msg.GetDataLen())
    45. //根据dataLen从io中读取字节流
    46. _, err := io.ReadFull(conn, msg.Data)
    47. if err != nil {
    48. fmt.Println("server unpack data err:", err)
    49. return
    50. }
    51. fmt.Println("==> Recv Msg: ID=", msg.Id, ", len=", msg.DataLen, ", data=", string(msg.Data))
    52. }
    53. time.Sleep(1*time.Second)
    54. }
    55. }

    代码不变。

    启动服务端

    1. $go run Client.go

    服务端结果:

    客户端结果:

    1. $ go run Client0.go
    2. Client Test ... start
    3. ==> Recv Msg: ID= 2 , len= 21 , data= DoConnection BEGIN...
    4. ==> Recv Msg: ID= 0 , len= 18 , data= ping...ping...ping
    5. ==> Recv Msg: ID= 0 , len= 18 , data= ping...ping...ping
    6. ==> Recv Msg: ID= 0 , len= 18 , data= ping...ping...ping
    7. ^Csignal: interrupt

    客户端创建成功,回调Hook已经执行,并且Conn被添加到ConnManager 中, conn num = 1,

    当我们手动CTRL+C 关闭客户端的时候, 服务器ConnManager已经成功将Conn摘掉,conn num = 0.