Server.go
package mainimport ("fmt""zinx/ziface""zinx/znet")//ping test 自定义路由type PingRouter struct {znet.BaseRouter}//Ping Handlefunc (this *PingRouter) Handle(request ziface.IRequest) {fmt.Println("Call PingRouter Handle")//先读取客户端的数据,再回写ping...ping...pingfmt.Println("recv from client : msgId=", request.GetMsgID(), ", data=", string(request.GetData()))err := request.GetConnection().SendMsg(0, []byte("ping...ping...ping"))if err != nil {fmt.Println(err)}}//HelloZinxRouter Handletype HelloZinxRouter struct {znet.BaseRouter}func (this *HelloZinxRouter) Handle(request ziface.IRequest) {fmt.Println("Call HelloZinxRouter Handle")//先读取客户端的数据,再回写ping...ping...pingfmt.Println("recv from client : msgId=", request.GetMsgID(), ", data=", string(request.GetData()))err := request.GetConnection().SendMsg(1, []byte("Hello Zinx Router V0.6"))if err != nil {fmt.Println(err)}}func main() {//创建一个server句柄s := znet.NewServer()//配置路由s.AddRouter(0, &PingRouter{})s.AddRouter(1, &HelloZinxRouter{})//开启服务s.Serve()}
Server端设置了2个路由,一个是MsgId为0的消息会执行PingRouter{}重写的Handle()方法,一个是MsgId为1的消息会执行HelloZinxRouter{}重写的Handle()方法。
我们现在写两个客户端,分别发送0消息和1消息来进行测试Zinx是否能够处理2个不同的消息业务。
Client0.go
package mainimport ("fmt""io""net""time""zinx/znet")/*模拟客户端*/func main() {fmt.Println("Client Test ... start")//3秒之后发起测试请求,给服务端开启服务的机会time.Sleep(3 * time.Second)conn,err := net.Dial("tcp", "127.0.0.1:7777")if err != nil {fmt.Println("client start err, exit!")return}for {//发封包message消息dp := znet.NewDataPack()msg, _ := dp.Pack(znet.NewMsgPackage(0,[]byte("Zinx V0.6 Client0 Test Message")))_, err := conn.Write(msg)if err !=nil {fmt.Println("write error err ", err)return}//先读出流中的head部分headData := make([]byte, dp.GetHeadLen())_, err = io.ReadFull(conn, headData) //ReadFull 会把msg填充满为止if err != nil {fmt.Println("read head error")break}//将headData字节流 拆包到msg中msgHead, err := dp.Unpack(headData)if err != nil {fmt.Println("server unpack err:", err)return}if msgHead.GetDataLen() > 0 {//msg 是有data数据的,需要再次读取data数据msg := msgHead.(*znet.Message)msg.Data = make([]byte, msg.GetDataLen())//根据dataLen从io中读取字节流_, err := io.ReadFull(conn, msg.Data)if err != nil {fmt.Println("server unpack data err:", err)return}fmt.Println("==> Recv Msg: ID=", msg.Id, ", len=", msg.DataLen, ", data=", string(msg.Data))}time.Sleep(1*time.Second)}}
Client1.go
package mainimport ("fmt""io""net""time""zinx/znet")/*模拟客户端*/func main() {fmt.Println("Client Test ... start")//3秒之后发起测试请求,给服务端开启服务的机会time.Sleep(3 * time.Second)conn,err := net.Dial("tcp", "127.0.0.1:7777")if err != nil {fmt.Println("client start err, exit!")return}for {//发封包message消息dp := znet.NewDataPack()msg, _ := dp.Pack(znet.NewMsgPackage(1,[]byte("Zinx V0.6 Client1 Test Message")))_, err := conn.Write(msg)if err !=nil {fmt.Println("write error err ", err)return}//先读出流中的head部分headData := make([]byte, dp.GetHeadLen())_, err = io.ReadFull(conn, headData) //ReadFull 会把msg填充满为止if err != nil {fmt.Println("read head error")break}//将headData字节流 拆包到msg中msgHead, err := dp.Unpack(headData)if err != nil {fmt.Println("server unpack err:", err)return}if msgHead.GetDataLen() > 0 {//msg 是有data数据的,需要再次读取data数据msg := msgHead.(*znet.Message)msg.Data = make([]byte, msg.GetDataLen())//根据dataLen从io中读取字节流_, err := io.ReadFull(conn, msg.Data)if err != nil {fmt.Println("server unpack data err:", err)return}fmt.Println("==> Recv Msg: ID=", msg.Id, ", len=", msg.DataLen, ", data=", string(msg.Data))}time.Sleep(1*time.Second)}}
分别执行服务端和两个客户端
$go run Server.go
$go run Client0.go
$go run Client1.go
服务端显示结果
$ go run Server.goAdd api msgId = 0Add api msgId = 1[START] Server name: zinx v-0.6 demoApp,listenner at IP: 127.0.0.1, Port 7777 is starting[Zinx] Version: V0.4, MaxConn: 3, MaxPacketSize: 4096start Zinx server zinx v-0.6 demoApp succ, now listenning...Reader Goroutine is runningCall PingRouter Handlerecv from client : msgId= 0 , data= Zinx V0.6 Client0 Test MessageReader Goroutine is runningCall HelloZinxRouter Handlerecv from client : msgId= 1 , data= Zinx V0.6 Client1 Test MessageCall PingRouter Handlerecv from client : msgId= 0 , data= Zinx V0.6 Client0 Test MessageCall HelloZinxRouter Handlerecv from client : msgId= 1 , data= Zinx V0.6 Client1 Test MessageCall PingRouter Handlerecv from client : msgId= 0 , data= Zinx V0.6 Client0 Test MessageCall HelloZinxRouter Handlerecv from client : msgId= 1 , data= Zinx V0.6 Client1 Test Message
客户端0显示结果
$ go run Client0.goClient Test ... start==> Recv Msg: ID= 0 , len= 18 , data= ping...ping...ping==> Recv Msg: ID= 0 , len= 18 , data= ping...ping...ping==> Recv Msg: ID= 0 , len= 18 , data= ping...ping...ping
客户端1显示结果
$ go run Client1.goClient Test ... start==> Recv Msg: ID= 1 , len= 22 , data= Hello Zinx Router V0.6==> Recv Msg: ID= 1 , len= 22 , data= Hello Zinx Router V0.6==> Recv Msg: ID= 1 , len= 22 , data= Hello Zinx Router V0.6
