1. 程式人生 > >go實現一個簡單的遊戲伺服器框架(lotou)網路通訊

go實現一個簡單的遊戲伺服器框架(lotou)網路通訊

目前網路通訊只實現了基於go的tcp的通訊。

go的tcp相關的主要介面

  • net.JoinHostPort 將一個host和port組成一個合法的網路地址(host:port)
  • net.ResolveTCPAddr 講一個string型別的網路地址轉換成一個TCPAddr 可以是tcp4 tcp6 tcp型別的地址
  • TCPListener TCP的監聽器,負責接收請求並建立一個新的tcp連線
    • net.ListenTCP 在一個指定的埠和地址上監聽tcp連線,如果埠是0,則內部隨機選取一個可以用的埠。
    • (*TCPListener) AcceptTCP 阻塞呼叫goroutinue,直到有一個新的連線到來或者錯誤產生的時候,如果沒有錯誤,則返回一個新的tcp連線。
  • TCPConn 表示一個tcp連線,通過它可以和遠端進行資料的收發
    • func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error) 請一個遠端連線,laddr通常都是傳入nil。
    • func (*TCPConn) Close 關閉一個tcp連線,關閉之後再進行讀取將會返回error
    • func (*TCPConn) SetReadDeadline 設定讀取資料的超時時間
    • func (*TCPConn) SetWriteDeadline 設定寫資料的超時時間
    • func (*TCPConn) Write 傳送資料
    • func (*TCPConn) Read 接收資料,會阻塞當前goroutinue知道有資料可讀,如果設定了超時時間,則如果超時也會返回。
    • func (*TCPConn) SetKeepAlive 啟動keepAlive之後,將會是作業系統層也會發送keepalive message,類似於應用層的心跳包的功能
    • func (*TCPConn) SetNoDelay 設定系統是否延遲傳送小包資料,預設是true,表示資料在Write後立即傳送。如果只關注每秒傳輸的量而不是打個packet延遲,可以考慮設定為false,這樣可以減少系統呼叫,但是小包可能被延遲到某個時刻才傳送。

lotou網路部分基本結構

在network/tcp目錄下一個一共有三個檔案

  • server 負責建立一個監聽socket,當了連線請求的時候接受連線並建立一個agent
    • tcp.New 建立一個新的tcp server,並設定訊息接收者
  • agent 負責每個連線的訊息傳送和接收
    每一個agent就相當於一個服務,一個agent開始執行之後,會啟動一個定時器,如果這個TCPCon在一定時間內沒有收到資料包,將會自行關閉。
    當有資料到來或者網路錯誤的時候,會將訊息轉發給關聯的服務進行進一步處理。

  • client 負責請求遠端連線以及socket上訊息傳送接收
    client接收連線、傳送資料的命令
    client不需要顯示的連線命令,當有資料需要傳送的時候,會自動去請求連線

其他服務通過服務間的通訊機制向agent和client傳送訊息,client、agent根據訊息型別進行不同的操作。

client和agent內部都有兩個goroutinue
- 一個用於處理其他服務傳送過來的訊息
- 一個用於從網路中接收資料並分包,一個合法的資料包有一個2位元組的包長度開始。
該模組出了分包,不負責資料的編解碼。

在該模組下有一個簡單的測試用例,包含了基本用法。