• 技术文章 >后端开发 >Python教程

    实现tcp的自动重连实例教程

    零下一度零下一度2017-06-16 10:53:13原创1125
    下面小编就为大家带来一篇golang之tcp自动重连实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    操作系统: 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自动重连。

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

    以上就是实现tcp的自动重连实例教程的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:golang tcp 重连
    上一篇:如何利用python3来实现TCP协议? 下一篇:详细介绍golang中的log模块
    PHP编程就业班

    相关文章推荐

    • 归纳总结Python常用模块大全• 实例详解python之requests模块• 实例详解Python元组• 经典技巧之Python案例详解• python列表和元组详解(实例详解)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网