操作系统: 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. 重载hash与isEqual:方法

    重载hash与isEqual:方法 前言 NSObject 自带了hash与isEqual:方法,服务于具有hash表结构的数据结构.NSObject自带的hash函数相当于hash表中的f(key) ...

  2. 真爱如血第一季/全集True Blood迅雷下载

    第一季 True Blood Season 1 (2008)看点:该剧根据小说<南方吸血鬼>(Southern Vampire)改编,故事围绕路易斯安那州的吸血鬼和人类展开,当日本将人造血 ...

  3. [Hook] 免root,自己进程内,binder hook (ClipboardManager)

    cp from : http://weishu.me/2016/02/16/understand-plugin-framework-binder-hook/ Android系统通过Binder机制给应 ...

  4. probotuf 标量数值类型

    标量数值类型 一个标量消息字段可以含有一个如下的类型--该表格展示了定义于.proto文件中的类型,以及与之对应的.在自动生成的访问类中定义的类型: .proto类型 Java 类型 C++类型 备注 ...

  5. DP思路

    在这里记录一些在大神们的博客,以及自己做过的一些DP的神奇思路吧 1.2015/04 NEUQ 月赛  转自:http://zyfzyf.is-programmer.com/posts/89993.h ...

  6. SharePoint 2013 基于表单 Membership 的身份验证

    其实关于SharePoint 2013 表单身份验证网上已经有很多了,比如SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authenticatio ...

  7. [leetcode]Word Break @ Python

    原题地址:https://oj.leetcode.com/problems/word-break/ 题意: Given a string s and a dictionary of words dic ...

  8. Proguard使用最新,最全教程,亲自试验

    最近公司有一个项目,是外包项目,由于对方也有技术人员,出于技术上的保密,需要对class文件进行二次处理,于是网上找了好久,只发现Proguard是用的最广泛而且网上资料最多的.由于不是纯JAVA项目 ...

  9. vue2.0路由-适合刚接触新手简单理解

    vue路由:vue-router vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并 ...

  10. JavaScript递归方法 生成 json tree 树形结构数据

    //递归方法 生成 json tree 数据 var getJsonTree = function(data, parentId) { var itemArr = []; for (var i = 0 ...