多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#### 10.3 链接属性Zinx-V0.10单元测试 那么,接下来,我们简单测试一下链接属性的设置与提取是否可用。 > Server.go ```go package main import ( "fmt" "zinx/ziface" "zinx/znet" ) //ping test 自定义路由 type PingRouter struct { znet.BaseRouter } //Ping Handle func (this *PingRouter) Handle(request ziface.IRequest) { fmt.Println("Call PingRouter Handle") //先读取客户端的数据,再回写ping...ping...ping fmt.Println("recv from client : msgId=", request.GetMsgID(), ", data=", string(request.GetData())) err := request.GetConnection().SendBuffMsg(0, []byte("ping...ping...ping")) if err != nil { fmt.Println(err) } } type HelloZinxRouter struct { znet.BaseRouter } //HelloZinxRouter Handle func (this *HelloZinxRouter) Handle(request ziface.IRequest) { fmt.Println("Call HelloZinxRouter Handle") //先读取客户端的数据,再回写ping...ping...ping fmt.Println("recv from client : msgId=", request.GetMsgID(), ", data=", string(request.GetData())) err := request.GetConnection().SendBuffMsg(1, []byte("Hello Zinx Router V0.10")) if err != nil { fmt.Println(err) } } //创建连接的时候执行 func DoConnectionBegin(conn ziface.IConnection) { fmt.Println("DoConnecionBegin is Called ... ") //=============设置两个链接属性,在连接创建之后=========== fmt.Println("Set conn Name, Home done!") conn.SetProperty("Name", "Aceld") conn.SetProperty("Home", "https://www.jianshu.com/u/35261429b7f1") //=================================================== err := conn.SendMsg(2, []byte("DoConnection BEGIN...")) if err != nil { fmt.Println(err) } } //连接断开的时候执行 func DoConnectionLost(conn ziface.IConnection) { //============在连接销毁之前,查询conn的Name,Home属性===== if name, err:= conn.GetProperty("Name"); err == nil { fmt.Println("Conn Property Name = ", name) } if home, err := conn.GetProperty("Home"); err == nil { fmt.Println("Conn Property Home = ", home) } //=================================================== fmt.Println("DoConneciotnLost is Called ... ") } func main() { //创建一个server句柄 s := znet.NewServer() //注册链接hook回调函数 s.SetOnConnStart(DoConnectionBegin) s.SetOnConnStop(DoConnectionLost) //配置路由 s.AddRouter(0, &PingRouter{}) s.AddRouter(1, &HelloZinxRouter{}) //开启服务 s.Serve() } ``` 这里主要看`DoConnectionBegin()`和`DoConnectionLost()`两个函数的实现, 利用在两个Hook函数中,设置链接属性和提取链接属性。链接创建之后给当前链接绑定两个属性"Name","Home", 那么我们在随时可以通过`conn.GetProperty()`方法得到链接已经设置的属性。 ```bash $go run Server.go ``` ``` $go run Client0.go ``` 服务端: ```bash $ go run Server.go Add api msgId = 0 Add api msgId = 1 [START] Server name: zinx v-0.10 demoApp,listenner at IP: 127.0.0.1, Port 7777 is starting [Zinx] Version: V0.4, MaxConn: 3, MaxPacketSize: 4096 start Zinx server zinx v-0.10 demoApp succ, now listenning... Worker ID = 9 is started. Worker ID = 5 is started. Worker ID = 6 is started. Worker ID = 7 is started. Worker ID = 8 is started. Worker ID = 1 is started. Worker ID = 0 is started. Worker ID = 2 is started. Worker ID = 3 is started. Worker ID = 4 is started. connection add to ConnManager successfully: conn num = 1 ---> CallOnConnStart.... DoConnecionBegin is Called ... Set conn Name, Home done! [Writer Goroutine is running] [Reader Goroutine is running] Add ConnID= 0 request msgID= 0 to workerID= 0 Call PingRouter Handle recv from client : msgId= 0 , data= Zinx V0.8 Client0 Test Message Add ConnID= 0 request msgID= 0 to workerID= 0 Call PingRouter Handle recv from client : msgId= 0 , data= Zinx V0.8 Client0 Test Message Add ConnID= 0 request msgID= 0 to workerID= 0 Call PingRouter Handle recv from client : msgId= 0 , data= Zinx V0.8 Client0 Test Message read msg head error read tcp4 127.0.0.1:7777->127.0.0.1:55208: read: connection reset by peer Conn Stop()...ConnID = 0 ---> CallOnConnStop.... Conn Property Name = Aceld Conn Property Home = https://www.jianshu.com/u/35261429b7f1 DoConneciotnLost is Called ... connection Remove ConnID= 0 successfully: conn num = 0 127.0.0.1:55208 [conn Reader exit!] 127.0.0.1:55208 [conn Writer exit!] ``` 客户端: ```bash $ go run Client0.go Client Test ... start ==> Recv Msg: ID= 2 , len= 21 , data= DoConnection BEGIN... ==> Recv Msg: ID= 0 , len= 18 , data= ping...ping...ping ==> Recv Msg: ID= 0 , len= 18 , data= ping...ping...ping ^Csignal: interrupt ``` 当我们终止客户端链接,那么服务端在断开链接之前,已经读取到了conn的两个属性Name和Home