操作系统: CentOS 6.9_x64

go语言版本: 1.8.3

问题描述

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

测试服务器示例代码:

/*
tcp server for test
E-Mail : Mike_Zhang@live.com
*/ package main import (
"fmt"
"net"
"os"
"strings"
"time"
) func checkError(err error) {
if err != nil {
fmt.Println(err)
os.Exit()
}
} func handleClient(conn net.Conn) {
conn.SetReadDeadline(time.Now().Add( * time.Minute))
request := make([]byte,)
defer conn.Close() for {
recv_len,err := conn.Read(request)
if err != nil {
fmt.Println(err)
break
}
if recv_len == {
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,)
}
} 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
E-Mail : Mike_Zhang@live.com
*/ 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( * 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( * time.Second)
}
}

运行效果:

[root@local t1]# ./tcpClient1
connect (127.0.0.1:) ok
recv msg : -- ::32.110977137 + CST recv msg : -- ::33.111868746 + CST recv data error
connect (127.0.0.1:) fail
connect (127.0.0.1:) fail
connect (127.0.0.1:) ok
recv msg : -- ::43.117203432 + CST recv msg : -- ::44.11853427 + CST

讨论

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

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

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170613_golang之tcp自动重连.rst

欢迎补充

golang之tcp自动重连的更多相关文章

  1. python之tcp自动重连

    操作系统: CentOS 6.9_x64 python语言版本: 2.7.13 问题描述 现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动重连. 测试服务器示例代 ...

  2. Netty 自动重连

    from: http://www.dozer.cc/2015/05/netty-auto-reconnect.html 自动重连 用 Netty 写 Client 和 Server 的时候必须要去处理 ...

  3. 解读dbcp自动重连那些事---转载

    http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 同样的内容,不同的描述方式,不一 ...

  4. 解读dbcp自动重连那些事(转)

    本文转自:http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 borrow 借,从连 ...

  5. 解读dbcp自动重连那些事

    转载自:http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 同样的内容,不同的描述方 ...

  6. 解读dbcp自动重连那些事(转)

    转自:http://agapple.iteye.com/blog/791943 Hi all : 最近在做 offerdetail 优化时,替换了数据库驱动,从 c3p0 0.9.1 -> db ...

  7. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

  8. 如何实现Azure虚拟网络中点到站VPN的自动重连

     在Windows Azure早期版本中,用户要在某台Azure平台之外的机器与Azure平台内部的机器建立专用连接,可以借助Azure Connect这个功能.当前的Azure版本,已经没有Az ...

  9. PERL DBI 自动重连问题

    [root@wx03 mojo]# cat relink.pl use Mojolicious::Lite; use JSON qw/encode_json decode_json/; use Enc ...

随机推荐

  1. linux 统计文件夹空间

     du -sh * | sort -nr 

  2. Activity间用Intent、Bundle、onActivityResult进行传值

    其实Activity间的传值就是通过Bundle,intent中也是自动生成了Bundle来传值,里面还有个onActivityResult()方法也可以传送数值. 如果一个Activity是由sta ...

  3. HotSpot Generations

    本文主要介绍HotSpot JVM的 Generations 机制, 原文来自 Oracle 文档  Java SE 6 HotSpot[tm] Virtual Machine Garbage Col ...

  4. JavaScript:Array 对象

    ylbtech-JavaScript:Array 对象 1. 返回顶部 Array 对象 Array 对象用于在单个的变量中存储多个值. 创建 Array 对象的语法: new Array(); ne ...

  5. verilog语法实例学习(6)

    函数和任务 函数 https://wenku.baidu.com/view/d31d1ba8dd3383c4bb4cd283.html verilog中函数的目的是允许代码写成模块的方式而不是定义独立 ...

  6. iOS开发-iOS8地理位置定位

    现在的App基本上都有定位功能,旅游网站根据定位推荐旅游景点,新闻App通过地理位置推荐当地新闻,社交类的App通过位置交友,iOS中实现以上功能需要一个核心的框架CoreLocation,框架提供了 ...

  7. ORM数据库框架 SQLite 常用数据库框架比较 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  8. 基于JT/T808协议的车辆监控平台架构方案

    技术支持QQ:78772895 1.接入网关应用采用mina/netty+spring架构,独立于其他应用,主要负责维护接入终端的tcp链接.上行以及下行消息的解码.编码.流量控制,黑白名单等安全控制 ...

  9. Java Base64加密解密

    使用Apache commons codec 类Base64 maven依赖 <dependency> <groupId>commons-codec</groupId&g ...

  10. ofstream的使用方法--超级精细。C++文件写入、读出函数(转)

    ofstream的使用方法ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;  在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的, ...