<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 1. Zinx-V0.1-基礎Server 為了更好的看到Zinx框架,首先Zinx構建Zinx的最基本的兩個模塊`ziface`和`znet`。 `ziface`主要是存放一些Zinx框架的全部模塊的抽象層接口類,Zinx框架的最基本的是服務類接口`iserver`,定義在ziface模塊中。 `znet`模塊是zinx框架中網絡相關功能的實現,所有網絡相關模塊都會定義在`znet`模塊中。 #### 1.1 Zinx-V0.1 代碼實現 ##### A\) 創建zinx框架 在$GOPATH/src下創建`zinx`文件夾 ##### B\) 創建ziface、znet模塊 在zinx/下 創建ziface、znet文件夾, 使當前的文件路徑如下: ```bash └── zinx ├── ziface │ └── └── znet ├── ``` ##### C\) 在ziface下創建服務模塊抽象層iserver.go > zinx/ziface/iserver.go ```go package ziface //定義服務器接口 type IServer interface{ //啟動服務器方法 Start() //停止服務器方法 Stop() //開啟業務服務方法 Serve() } ``` ##### D\) 在znet下實現服務模塊server.go ```go package znet import ( "fmt" "net" "time" "zinx/ziface" ) //iServer 接口實現,定義一個Server服務類 type Server struct { //服務器的名稱 Name string //tcp4 or other IPVersion string //服務綁定的IP地址 IP string //服務綁定的端口 Port int } //============== 實現 ziface.IServer 里的全部接口方法 ======== //開啟網絡服務 func (s *Server) Start() { fmt.Printf("[START] Server listenner at IP: %s, Port %d, is starting\n", s.IP, s.Port) //開啟一個go去做服務端Linster業務 go func() { //1 獲取一個TCP的Addr addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port)) if err != nil { fmt.Println("resolve tcp addr err: ", err) return } //2 監聽服務器地址 listenner, err:= net.ListenTCP(s.IPVersion, addr) if err != nil { fmt.Println("listen", s.IPVersion, "err", err) return } //已經監聽成功 fmt.Println("start Zinx server ", s.Name, " succ, now listenning...") //3 啟動server網絡連接業務 for { //3.1 阻塞等待客戶端建立連接請求 conn, err := listenner.AcceptTCP() if err != nil { fmt.Println("Accept err ", err) continue } //3.2 TODO Server.Start() 設置服務器最大連接控制,如果超過最大連接,那么則關閉此新的連接 //3.3 TODO Server.Start() 處理該新連接請求的 業務 方法, 此時應該有 handler 和 conn是綁定的 //我們這里暫時做一個最大512字節的回顯服務 go func () { //不斷的循環從客戶端獲取數據 for { buf := make([]byte, 512) cnt, err := conn.Read(buf) if err != nil { fmt.Println("recv buf err ", err) continue } //回顯 if _, err := conn.Write(buf[:cnt]); err !=nil { fmt.Println("write back buf err ", err) continue } } }() } }() } func (s *Server) Stop() { fmt.Println("[STOP] Zinx server , name " , s.Name) //TODO Server.Stop() 將其他需要清理的連接信息或者其他信息 也要一并停止或者清理 } func (s *Server) Serve() { s.Start() //TODO Server.Serve() 是否在啟動服務的時候 還要處理其他的事情呢 可以在這里添加 //阻塞,否則主Go退出, listenner的go將會退出 for { time.Sleep(10*time.Second) } } /* 創建一個服務器句柄 */ func NewServer (name string) ziface.IServer { s:= &Server { Name :name, IPVersion:"tcp4", IP:"0.0.0.0", Port:7777, } return s } ``` 好了,以上我們已經完成了Zinx-V0.1的基本雛形了,雖然只是一個基本的回寫客戶端數據\(我們之后會自定義處理客戶端業務方法\),那么接下來我們就應該測試我們當前的zinx-V0.1是否可以使用了。 #### 1.2 Zinx框架單元測試樣例 理論上我們應該可以現在導入zinx框架,然后寫一個服務端程序,再寫一個客戶端程序進行測試,但是我們可以通過Go的單元Test功能,進行單元測試 創建zinx/znet/server\_test.go ```go package znet import ( "fmt" "net" "testing" "time" ) /* 模擬客戶端 */ func ClientTest() { 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 { _, err := conn.Write([]byte("hello ZINX")) if err !=nil { fmt.Println("write error err ", err) return } buf :=make([]byte, 512) cnt, err := conn.Read(buf) if err != nil { fmt.Println("read buf error ") return } fmt.Printf(" server call back : %s, cnt = %d\n", buf, cnt) time.Sleep(1*time.Second) } } //Server 模塊的測試函數 func TestServer(t *testing.T) { /* 服務端測試 */ //1 創建一個server 句柄 s s := NewServer("[zinx V0.1]") /* 客戶端測試 */ go ClientTest() //2 開啟服務 s.Serve() } ``` 在zinx/znet下執行 ```bash $ go test ``` 執行結果,如下: ```bash [START] Server listenner at IP: 0.0.0.0, Port 7777, is starting Client Test ... start listen tcp4 err listen tcp4 0.0.0.0:7777: bind: address already in use server call back : hello ZINX, cnt = 6 server call back : hello ZINX, cnt = 6 server call back : hello ZINX, cnt = 6 server call back : hello ZINX, cnt = 6 ``` 說明我們的zinx框架已經可以使用了。 #### 1.3 使用Zinx-V0.1完成應用程序 當然,如果感覺go test 好麻煩,那么我們可以完全基于zinx寫兩個應用程序,Server.go , Client.go Server.go ```go package main import ( "zinx/znet" ) //Server 模塊的測試函數 func main() { //1 創建一個server 句柄 s s := znet.NewServer("[zinx V0.1]") //2 開啟服務 s.Serve() } ``` 啟動Server.go ```bash go run Server.go ``` Client.go ```go package main import ( "fmt" "net" "time" ) 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 { _, err := conn.Write([]byte("hahaha")) if err !=nil { fmt.Println("write error err ", err) return } buf :=make([]byte, 512) cnt, err := conn.Read(buf) if err != nil { fmt.Println("read buf error ") return } fmt.Printf(" server call back : %s, cnt = %d\n", buf, cnt) time.Sleep(1*time.Second) } } ``` 啟動Client.go進行測試 ```bash go run Client.go ```
                  <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>

                              哎呀哎呀视频在线观看