golang tcp keepalive实践
生活随笔
收集整理的這篇文章主要介紹了
golang tcp keepalive实践
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前文中已經介紹了TCP keep alive的做了詳盡說明,本文結合golang,介紹如何使用TCP keep alive。
目前golang net包不提供TCP keep alive?空閑多長時間開始探測、?探測總次數直接設置。
可以使用第三方包。
1.下載第三方包
git clone git@github.com:felixge/tcpkeepalive.git注意放到GOPATH目錄下。
2.例子
2.1 server
server端,接受client連接請求,建立連接后,設置連接的空閑多長時間開始探測、探測時間間隔、探測總次數。
本例中,我們設置的參數如下:
- 空閑多長時間開始探測?keepAliveIdle: 10s
- 探測時間間隔?keepAliveInterval: 10s
- 探測總次數?keepAliveCount:9
server端發送一次數據后,停住。等待10s,開始發送tcp keep alive.
server 代碼如下:
package mainimport ("net""log""time""github.com/tcpkeepalive" )func main() {addr := "0.0.0.0:8080"tcpAddr, err := net.ResolveTCPAddr("tcp",addr)if err != nil {log.Fatalf("net.ResovleTCPAddr fail:%s", addr)}listener, err := net.ListenTCP("tcp", tcpAddr)if err != nil {log.Fatalf("listen %s fail: %s", addr, err)} else {log.Println("rpc listening", addr)}for {conn, err := listener.Accept()if err != nil {log.Println("listener.Accept error:", err)continue}go handleConnection(conn)}}func setTcpKeepAlive(conn net.Conn) (*tcpkeepalive.Conn, error) {newConn, err := tcpkeepalive.EnableKeepAlive(conn)if err != nil {log.Println("EnableKeepAlive failed:", err)return nil, err}err = newConn.SetKeepAliveIdle(10*time.Second)if err != nil {log.Println("SetKeepAliveIdle failed:", err)return nil, err}err = newConn.SetKeepAliveCount(9)if err != nil {log.Println("SetKeepAliveCount failed:", err)return nil, err}err = newConn.SetKeepAliveInterval(10*time.Second)if err != nil {log.Println("SetKeepAliveInterval failed:", err)return nil, err}return newConn, nil }func handleConnection(conn net.Conn) {defer conn.Close()newConn, err := setTcpKeepAlive(conn)if err != nil {log.Println("setTcpKeepAlive failed:", err)return}var buffer []byte = []byte("You are welcome. I'm server.")for {time.Sleep(1*time.Second)n, err := newConn.Write(buffer)if err != nil {log.Println("Write error:", err)break}log.Println("send:", n)select{}}log.Println("connetion end")}2.2 client
client端很簡單,負責接收數據。
package mainimport ("fmt""net""os" )func main() {conn, err := net.Dial("tcp", "127.0.0.1:8080")if err != nil {fmt.Println("dial failed:", err)os.Exit(1)}defer conn.Close()buffer := make([]byte, 512)for {n, err := conn.Read(buffer)if err != nil {fmt.Println("Read failed:", err)return}fmt.Println("count:", n, "msg:", string(buffer))}}3.查看結果
server輸出
019/05/26 22:22:00 rpc listening 0.0.0.0:8080 2019/05/26 22:22:15 send: 28client輸出
count: 28 msg: You are welcome. I'm server.通過tcpdump 或者wireshark抓包,可以看到TCP Keep-Alive的數據包發送情況。
4.參考
Using TCP keepalive with Go
github tcpkeepalive
Just try, don't shy.
總結
以上是生活随笔為你收集整理的golang tcp keepalive实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP keepalive的详解(解惑)
- 下一篇: nginx系列之二:配置文件解读