PHP前端开发

实现tcp的自动重连实例教程

百变鹏仔 2小时前 #Python
文章标签 实例教程

下面小编就为大家带来一篇golang之tcp自动重连实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

操作系统: CentOS 6.9_x64

go语言版本: 1.8.3

问题描述

现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动重连。

测试服务器示例代码:

/*tcp server for test*/package mainimport (  "fmt"  "net"  "os"  "strings"  "time")func checkError(err error) {  if err != nil {    fmt.Println(err)    os.Exit(1)  }}func handleClient(conn net.Conn) {  conn.SetReadDeadline(time.Now().Add(3 * time.Minute))  request := make([]byte,1024)  defer conn.Close()  for {    recv_len,err := conn.Read(request)    if err != nil {      fmt.Println(err)      break    }    if recv_len == 0 {      break    }    recvData := strings.TrimSpace(string(request[:recv_len]))    fmt.Println("recv_len : ",recv_len)    fmt.Println("recv_data : " + recvData)    daytime := time.Now().String()    conn.Write([]byte(daytime + ""))    request = make([]byte,1024)  }}func main() {  bindInfo := ":12345"  tcpAddr,err := net.ResolveTCPAddr("tcp4",bindInfo)  checkError(err)  listener,err := net.ListenTCP("tcp",tcpAddr)  checkError(err)  for {    cc,err := listener.Accept()    if err != nil {      continue    }    go handleClient(cc)  }}

解决方案

/*tcp client with reconnect*/package mainimport (  "net"  "fmt"  "bufio"  "time")func doTask(conn net.Conn) {  for {    fmt.Fprintf(conn,"test msg")    msg,err := bufio.NewReader(conn).ReadString('')    if err != nil {      fmt.Println("recv data error")      break    }else{      fmt.Println("recv msg : ",msg)    }    time.Sleep(1 * time.Second)  }}func main() {  hostInfo := "127.0.0.1:12345"  for {    conn,err := net.Dial("tcp",hostInfo)    fmt.Print("connect (",hostInfo)    if err != nil {      fmt.Println(") fail")    }else{      fmt.Println(") ok")      defer conn.Close()      doTask(conn)    }    time.Sleep(3 * time.Second)  }}

运行效果:


[root@local t1]# ./tcpClient1connect (127.0.0.1:12345) okrecv msg : 2017-06-12 21:10:32.110977137 +0800 CSTrecv msg : 2017-06-12 21:10:33.111868746 +0800 CSTrecv data errorconnect (127.0.0.1:12345) failconnect (127.0.0.1:12345) failconnect (127.0.0.1:12345) okrecv msg : 2017-06-12 21:10:43.117203432 +0800 CSTrecv msg : 2017-06-12 21:10:44.11853427 +0800 CST

讨论

这里只是个简单的示例代码,实现了tcp自动重连。

好,就这些了,希望对你有帮助。