欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

golang之tcp自动重连实现方法

程序员文章站 2022-03-20 16:14:58
操作系统: centos 6.9_x64 go语言版本: 1.8.3 问题描述 现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动...

操作系统: centos 6.9_x64

go语言版本: 1.8.3

问题描述

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

测试服务器示例代码:

/*
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)
  }
}

解决方案

/*
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)
  }
}

运行效果:

[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

讨论

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

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

以上这篇golang之tcp自动重连实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。