go實現一個簡單的遊戲伺服器框架(lotou)網路通訊
阿新 • • 發佈:2019-02-18
目前網路通訊只實現了基於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位元組的包長度開始。
該模組出了分包,不負責資料的編解碼。
在該模組下有一個簡單的測試用例,包含了基本用法。