golang之tcp自动重连实现方法

发布时间 - 2026-01-11 01:52:11    点击率:

操作系统: 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自动重连实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# golang  # tcp  # 重连  # 利用Golang实现TCP连接的双向拷贝详解  # golang 实现tcp转发代理的方法  # Golang 实现Socket服务端和客户端使用TCP协议通讯  # golang中net的tcp服务使用  # Golang通过包长协议处理TCP粘包的问题解决  # Golang 编写Tcp服务器的解决方案  # golang实现简单的tcp数据传输  # Golang实现自己的Redis(TCP篇)实例探究  # Golang TCP网络编程的具体实现  # 给大家  # 是个  # 你有  # 希望能  # 这篇  # 不稳定  # 小编  # 大家多多  # 由于种种原因  # 客户端  # 实现了  # 操作系统  # nil  # error  # err  # handleClient  # Exit  # Println  # strings  # os 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  详解Huffman编码算法之Java实现  Laravel如何创建自定义Facades?(详细步骤)  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  高性能网站服务器部署指南:稳定运行与安全配置优化方案  iOS验证手机号的正则表达式  详解Android——蓝牙技术 带你实现终端间数据传输  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  简历在线制作网站免费版,如何创建个人简历?  iOS UIView常见属性方法小结  EditPlus中的正则表达式 实战(2)  Laravel怎么清理缓存_Laravel optimize clear命令详解  jQuery 常见小例汇总  青岛网站建设如何选择本地服务器?  如何快速搭建高效服务器建站系统?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Laravel如何配置和使用缓存?(Redis代码示例)  Linux网络带宽限制_tc配置实践解析【教程】  nginx修改上传文件大小限制的方法  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何自定义分页视图?(Pagination示例)  MySQL查询结果复制到新表的方法(更新、插入)  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  网站建设整体流程解析,建站其实很容易!  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Android okhttputils现在进度显示实例代码  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  如何解决hover在ie6中的兼容性问题  制作企业网站建设方案,怎样建设一个公司网站?  java获取注册ip实例  jQuery validate插件功能与用法详解  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  个人网站制作流程图片大全,个人网站如何注销?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤