操作系统: 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. jQuery Ajax方式上传文件实现暂停或取消上传

    未上传时要实现取消,很简单... 但如果用户点击了上传,并加载了进度信息... 2017-05-04再次改进.在上传过程中用户可以按 Esc 来取消上传(取消当前上传,或者是全部上传)... 也可以在 ...

  2. Android Studio安装和配置的方法 & 错误解决

    Android Studio终于到了1.0时代了,所以我也试着去学习了下如何使用它.上手确实比较麻烦,今天就分享下如何去下载并使用它. 一.下载 & 安装 大家可以去google给出的地址下载 ...

  3. [转]专访企业QQ SaaS团队,谈企业级LNMP架构设计

    FROM : http://www.csdn.net/article/2014-08-20/2821302-interview-tencent-b-qq-shuai-wang 对比IaaS和PaaS, ...

  4. Django的事务性

    Django默认是自动提交的 使用TestCase的每个test用例都是事务性的.如果不想这样,可以使用TransactionTestCase 替代 Django自动保证delete()/update ...

  5. java-nio之zero copy深入分析

    对于所有的io操作,底层一定是调用操作系统的api来进行读写.受限于不同的操作系统,操作方式一定是有差异的.以下read和write操作,可以看做服务器从磁盘硬件上读取文件数据,然后通过socket发 ...

  6. NIO中的heap Buffer和direct Buffer区别

    在Java的NIO中,我们一般采用ByteBuffer缓冲区来传输数据,一般情况下我们创建Buffer对象是通过ByteBuffer的两个静态方法: ByteBuffer.allocate(int c ...

  7. html table奇偶行颜色设置 (CSS选择器)

    :nth-child(n) 选择器匹配属于其父元素的第 N 个子元素,不论元素的类型.n 可以是数字.关键词或公式. 下面的例子, 设置表格的奇偶行背景颜色不同:单独设置表格的第1列背景颜色不同. & ...

  8. 2、Python特征

    Python特征 Python编程语言中的定位 脚本语言 高阶动态编程语言 简单易学 Python是一种代表简单主义思想的语言.Python的这种伪代码本质是它最大的优点之一.它使你能够专注于解决问题 ...

  9. winrar5.50去广告教程(仅供学习使用)

    https://blog.csdn.net/EnigmCode/article/details/78328873 第一步:到WinRAR官网www.rarlab.com下载自己需要的版本,我这里选择C ...

  10. Android Studio中实现AIDL

    AIDL 先来两个传送门: http://www.cnblogs.com/yydcdut/p/3961545.html Android面试,与Service交互方式 http://www.cnblog ...