操作系统: CentOS 6.9_x64

go语言版本: 1.8.3

问题描述

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

测试服务器示例代码:

  1. /*
  2. tcp server for test
  3. E-Mail : Mike_Zhang@live.com
  4. */
  5.  
  6. package main
  7.  
  8. import (
  9. "fmt"
  10. "net"
  11. "os"
  12. "strings"
  13. "time"
  14. )
  15.  
  16. func checkError(err error) {
  17. if err != nil {
  18. fmt.Println(err)
  19. os.Exit()
  20. }
  21. }
  22.  
  23. func handleClient(conn net.Conn) {
  24. conn.SetReadDeadline(time.Now().Add( * time.Minute))
  25. request := make([]byte,)
  26. defer conn.Close()
  27.  
  28. for {
  29. recv_len,err := conn.Read(request)
  30. if err != nil {
  31. fmt.Println(err)
  32. break
  33. }
  34. if recv_len == {
  35. break
  36. }
  37. recvData := strings.TrimSpace(string(request[:recv_len]))
  38. fmt.Println("recv_len : ",recv_len)
  39. fmt.Println("recv_data : " + recvData)
  40. daytime := time.Now().String()
  41. conn.Write([]byte(daytime + "\n"))
  42. request = make([]byte,)
  43. }
  44. }
  45.  
  46. func main() {
  47. bindInfo := ":12345"
  48. tcpAddr,err := net.ResolveTCPAddr("tcp4",bindInfo)
  49. checkError(err)
  50. listener,err := net.ListenTCP("tcp",tcpAddr)
  51. checkError(err)
  52. for {
  53. cc,err := listener.Accept()
  54. if err != nil {
  55. continue
  56. }
  57. go handleClient(cc)
  58. }
  59. }

解决方案

  1. /*
  2. tcp client with reconnect
  3. E-Mail : Mike_Zhang@live.com
  4. */
  5.  
  6. package main
  7.  
  8. import (
  9. "net"
  10. "fmt"
  11. "bufio"
  12. "time"
  13. )
  14.  
  15. func doTask(conn net.Conn) {
  16. for {
  17. fmt.Fprintf(conn,"test msg\n")
  18. msg,err := bufio.NewReader(conn).ReadString('\n')
  19. if err != nil {
  20. fmt.Println("recv data error")
  21. break
  22. }else{
  23. fmt.Println("recv msg : ",msg)
  24. }
  25. time.Sleep( * time.Second)
  26. }
  27.  
  28. }
  29.  
  30. func main() {
  31. hostInfo := "127.0.0.1:12345"
  32.  
  33. for {
  34. conn,err := net.Dial("tcp",hostInfo)
  35. fmt.Print("connect (",hostInfo)
  36. if err != nil {
  37. fmt.Println(") fail")
  38. }else{
  39. fmt.Println(") ok")
  40. defer conn.Close()
  41. doTask(conn)
  42. }
  43. time.Sleep( * time.Second)
  44. }
  45. }

运行效果:

  1. [root@local t1]# ./tcpClient1
  2. connect (127.0.0.1:) ok
  3. recv msg : -- ::32.110977137 + CST
  4.  
  5. recv msg : -- ::33.111868746 + CST
  6.  
  7. recv data error
  8. connect (127.0.0.1:) fail
  9. connect (127.0.0.1:) fail
  10. connect (127.0.0.1:) ok
  11. recv msg : -- ::43.117203432 + CST
  12.  
  13. 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. ifram 取父窗体的URL地址

    var url=''; try { url = window.top.document.referrer ;     } catch(M) {           if (window.parent) ...

  2. mongodb centos7上的安装

    1,下载安装包 下载mongoDB的安装文件地址:https://www.mongodb.org/downloads#production 选择Linux 64-bit legacy 版本,下载到目标 ...

  3. 低版本系统兼容的ActionBar(四)添加Tab+添加自定义的Tab视图+Fragment

    在ActionBar中添加Tab是很有用的技巧.在support V7库的支持下,我们几乎可以用和之前一样的方式来添加Tab,对于Tab来说,我们可以和MenuItem一样,给他定义自己的视图.我这里 ...

  4. C# Linq获取两个List或数组的差集交集

      List<); list1.Add(); list1.Add(); List<); list2.Add(); list2.Add(); //得到的结果是4,5 即减去了相同的元素. L ...

  5. [Web 前端] 使用yarn代替npm作为node.js的模块管理器

    cp from : https://www.jianshu.com/p/bfe96f89da0e     Fast, reliable, and secure dependency managemen ...

  6. JUnit4单元测试入门教程

    本文按以下顺序讲解JUnit4的使用 下载jar包 单元测试初体验 自动生成测试类 执行顺序 @Test的属性 下载jar包## 下载地址 在github上,把以下两个jar包都下载下来.     下 ...

  7. 统计学中RR OR AR HR的区别

    一.相对危险度(RR)——队列研究中分析暴露因素与发病的关联程度 队列研究是选择暴露及未暴露于某一因素的两组人群,追踪其各自的发病结局,比较两组发病结局的差异,从而判定暴露因素与疾病有无关联及关联大小 ...

  8. qt.qpa.plugin: Could not find the Qt platform plugin "windows" in ""

    转载:https://forum.qt.io/topic/97484/qt-5-12-make-mingw-32-release/12 I build Qt 5.12 with MinGW 7.3.0 ...

  9. RxJava RxBinding RxView 控件事件 MD

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

  10. 强化学习之Q-learning简介

    https://blog.csdn.net/Young_Gy/article/details/73485518 强化学习在alphago中大放异彩,本文将简要介绍强化学习的一种q-learning.先 ...