最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:懂视网 责编:小OO 时间:2020-11-27 14:24:06
文档

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

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

下面小编就为大家带来一篇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 + "
"))
 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
")
 msg,err := bufio.NewReader(conn).ReadString('
')
 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的自动重连实例教程

操作系统: CentOS 6.9_x64。go语言版本: 1.8.3。问题描述;现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动重连。测试服务器示例代码。
推荐度:
标签: 教程 实现 示例
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top