<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                #### 3.4 Zinx-V0.3代碼實現 zinx/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 //當前Server由用戶綁定的回調router,也就是Server注冊的鏈接對應的處理業務 Router ziface.IRouter } /* 創建一個服務器句柄 */ func NewServer (name string) ziface.IServer { s:= &Server { Name :name, IPVersion:"tcp4", IP:"0.0.0.0", Port:7777, Router: nil, } return s } //============== 實現 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...") //TODO server.go 應該有一個自動生成ID的方法 var cid uint32 cid = 0 //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 處理該新連接請求的 業務 方法, 此時應該有 handler 和 conn是綁定的 dealConn := NewConntion(conn, cid, s.Router) cid ++ //3.4 啟動當前鏈接的處理業務 go dealConn.Start() } }() } 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 (s *Server)AddRouter(router ziface.IRouter) { s.Router = router fmt.Println("Add Router succ! " ) } ``` zinx/znet/conneciont.go ```go package znet import ( "fmt" "net" "zinx/ziface" ) type Connection struct { //當前連接的socket TCP套接字 Conn *net.TCPConn //當前連接的ID 也可以稱作為SessionID,ID全局唯一 ConnID uint32 //當前連接的關閉狀態 isClosed bool //該連接的處理方法router Router ziface.IRouter //告知該鏈接已經退出/停止的channel ExitBuffChan chan bool } //創建連接的方法 func NewConntion(conn *net.TCPConn, connID uint32, router ziface.IRouter) *Connection{ c := &Connection{ Conn: conn, ConnID: connID, isClosed: false, Router: router, ExitBuffChan: make(chan bool, 1), } return c } func (c *Connection) StartReader() { fmt.Println("Reader Goroutine is running") defer fmt.Println(c.RemoteAddr().String(), " conn reader exit!") defer c.Stop() for { //讀取我們最大的數據到buf中 buf := make([]byte, 512) _, err := c.Conn.Read(buf) if err != nil { fmt.Println("recv buf err ", err) c.ExitBuffChan <- true continue } //得到當前客戶端請求的Request數據 req := Request{ conn:c, data:buf, } //從路由Routers 中找到注冊綁定Conn的對應Handle go func (request ziface.IRequest) { //執行注冊的路由方法 c.Router.PreHandle(request) c.Router.Handle(request) c.Router.PostHandle(request) }(&req) } } //啟動連接,讓當前連接開始工作 func (c *Connection) Start() { //開啟處理該鏈接讀取到客戶端數據之后的請求業務 go c.StartReader() for { select { case <- c.ExitBuffChan: //得到退出消息,不再阻塞 return } } } //停止連接,結束當前連接狀態M func (c *Connection) Stop() { //1. 如果當前鏈接已經關閉 if c.isClosed == true { return } c.isClosed = true //TODO Connection Stop() 如果用戶注冊了該鏈接的關閉回調業務,那么在此刻應該顯示調用 // 關閉socket鏈接 c.Conn.Close() //通知從緩沖隊列讀數據的業務,該鏈接已經關閉 c.ExitBuffChan <- true //關閉該鏈接全部管道 close(c.ExitBuffChan) } //從當前連接獲取原始的socket TCPConn func (c *Connection) GetTCPConnection() *net.TCPConn { return c.Conn } //獲取當前連接ID func (c *Connection) GetConnID() uint32{ return c.ConnID } //獲取遠程客戶端地址信息 func (c *Connection) RemoteAddr() net.Addr { return c.Conn.RemoteAddr() } ```
                  <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>

                              哎呀哎呀视频在线观看