Home  >  Article  >  Backend Development  >  Implementation of tcp automatic reconnection example tutorial

Implementation of tcp automatic reconnection example tutorial

零下一度
零下一度Original
2017-06-16 10:53:132127browse

The following editor will bring you an article on how to implement automatic tcp reconnection in golang. The editor thinks it is quite good, so I will share it with you now and give it as a reference for everyone. Let’s follow the editor and take a look

Operating system: CentOS 6.9_x64

go language version: 1.8.3

Problem description

There is an existing tcp client program that needs to regularly retrieve data from the server, but needs to automatically reconnect due to various reasons (network instability, etc.).

Test server sample code:

/*
tcp server for test

*/


package main

import (
  "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 + "\n"))
    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)
  }
}

Solution

/*
tcp client with reconnect

*/

package main

import (
  "net"
  "fmt"
  "bufio"
  "time"
)

func doTask(conn net.Conn) {
  for {
    fmt.Fprintf(conn,"test msg\n")
    msg,err := bufio.NewReader(conn).ReadString('\n')
    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)
  }
}


Running effect:


##

[root@local t1]# ./tcpClient1
connect (127.0.0.1:12345) ok
recv msg : 2017-06-12 21:10:32.110977137 +0800 CST

recv msg : 2017-06-12 21:10:33.111868746 +0800 CST

recv data error
connect (127.0.0.1:12345) fail
connect (127.0.0.1:12345) fail
connect (127.0.0.1:12345) ok
recv msg : 2017-06-12 21:10:43.117203432 +0800 CST

recv msg : 2017-06-12 21:10:44.11853427 +0800 CST

Discussion

Here is just a simple sample code that implements tcp automatic reconnection.

Okay, that’s all, I hope it helps.

The above is the detailed content of Implementation of tcp automatic reconnection example tutorial. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn