<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                #### 9.5 使用Zinx-V0.9完成應用程序 好了,現在我們基本上已經將全部的連接管理的功能集成到Zinx中了,接下來就需要測試一下鏈接管理模塊是否可以使用了。 寫一個服務端: > 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.8")) if err != nil { fmt.Println(err) } } //創建連接的時候執行 func DoConnectionBegin(conn ziface.IConnection) { fmt.Println("DoConnecionBegin is Called ... ") err := conn.SendMsg(2, []byte("DoConnection BEGIN...")) if err != nil { fmt.Println(err) } } //連接斷開的時候執行 func DoConnectionLost(conn ziface.IConnection) { 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() } ``` 我們這里注冊了兩個Hook函數一個是鏈接初始化之后`DoConnectionBegin()`和鏈接停止之前`DoConnectionLost()`。 `DoConnectionBegin()`會發給客戶端一個消息2的文本,并且在服務端打印一個調試信息"DoConnecionBegin is Called ... " `DoConnectionLost()`在服務端打印一個調試信息"DoConneciotnLost is Called ... " 客戶端: > Client.go ```go package main import ( "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.8 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) } } ``` 代碼不變。 啟動服務端 ``` $go run Server.go ``` 啟動客戶端 ``` $go run Client.go ``` 服務端結果: ```bash $ go run Server.go Add api msgId = 0 Add api msgId = 1 [START] Server name: zinx v-0.8 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.8 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 ... [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 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:49510: read: connection reset by peer Conn Stop()...ConnID = 0 ---> CallOnConnStop.... DoConneciotnLost is Called ... connection Remove ConnID= 0 successfully: conn num = 0 127.0.0.1:49510 [conn Reader exit!] 127.0.0.1:49510 [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 ==> Recv Msg: ID= 0 , len= 18 , data= ping...ping...ping ==> Recv Msg: ID= 0 , len= 18 , data= ping...ping...ping ^Csignal: interrupt ``` 客戶端創建成功,回調Hook已經執行,并且Conn被添加到ConnManager 中, conn num = 1, 當我們手動CTRL+C 關閉客戶端的時候, 服務器ConnManager已經成功將Conn摘掉,conn num = 0. 同時服務端也打印出 conn停止之后的回調信息。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看