golang之tcp自动重连实现方法

 更新时间:2017年06月14日 08:21:35   投稿:jingxian  
下面小编就为大家带来一篇golang之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自动重连实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • gtoken替换jwt实现sso登录的问题小结

    gtoken替换jwt实现sso登录的问题小结

    这篇文章主要介绍了gtoken替换jwt实现sso登录,主要介绍了替换jwt的原因分析及gtoken的优势,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • goland安装1.7版本报错Unpacked SDK is corrupted解决

    goland安装1.7版本报错Unpacked SDK is corrupted解决

    这篇文章主要为大家介绍了goland安装1.7版本报错Unpacked SDK is corrupted解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 对Go语言中的context包源码分析

    对Go语言中的context包源码分析

    这篇文章主要对Go语言中的context包源码进行分析,context包析是1.15,context包定义了一个Context类型过这个Context接口类型, 就可以跨api边界/跨进程传递一些值,下面我们就来对context包源码进行分析,需要的小伙伴可以参考一下
    2022-02-02
  • 利用Golang解析json数据的方法示例

    利用Golang解析json数据的方法示例

    Go提供了原生的JSON库,并且与语言本身有效的集成在了一起。下面这篇文章将给大家介绍关于利用Golang解析json数据的方法,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-07-07
  • Golang打包配置文件的实现示例

    Golang打包配置文件的实现示例

    本文主要介绍了Golang打包配置文件的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Golang中基于HTTP协议的网络服务

    Golang中基于HTTP协议的网络服务

    HTTP协议是基于TCP/IP协议栈的,并且它也是一个面向普通文本的协议。这篇文章主要详细介绍了Golang中基于HTTP协议的网络服务,感兴趣的小伙伴可以借鉴一下
    2023-04-04
  • Go 1.21新增的slices包中切片函数用法详解

    Go 1.21新增的slices包中切片函数用法详解

    Go 1.21新增的 slices 包提供了很多和切片相关的函数,可以用于任何类型的切片,本文通过代码示例为大家介绍了部分切片函数的具体用法,感兴趣的小伙伴可以了解一下
    2023-08-08
  • GO语言对数组切片去重的实现

    GO语言对数组切片去重的实现

    本文主要介绍了GO语言对数组切片去重的实现,主要介绍了几种方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • golang-redis之sorted set类型操作详解

    golang-redis之sorted set类型操作详解

    这篇文章主要介绍了golang-redis之sorted set类型操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang控制协程执行顺序方法详解

    Golang控制协程执行顺序方法详解

    这篇文章主要介绍了Golang控制协程执行顺序的方法,Golang的语法和运行时直接内置了对并发的支持。Golang里的并发指的是能让某个函数独立于其他函数运行的能力
    2022-11-11

最新评论