golang之tcp自动重连实现方法
操作系统:CentOS6.9_x64
go语言版本:1.8.3
问题描述
现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动重连。
测试服务器示例代码:
/*
tcpserverfortest
*/
packagemain
import(
"fmt"
"net"
"os"
"strings"
"time"
)
funccheckError(errerror){
iferr!=nil{
fmt.Println(err)
os.Exit(1)
}
}
funchandleClient(connnet.Conn){
conn.SetReadDeadline(time.Now().Add(3*time.Minute))
request:=make([]byte,1024)
deferconn.Close()
for{
recv_len,err:=conn.Read(request)
iferr!=nil{
fmt.Println(err)
break
}
ifrecv_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)
}
}
funcmain(){
bindInfo:=":12345"
tcpAddr,err:=net.ResolveTCPAddr("tcp4",bindInfo)
checkError(err)
listener,err:=net.ListenTCP("tcp",tcpAddr)
checkError(err)
for{
cc,err:=listener.Accept()
iferr!=nil{
continue
}
gohandleClient(cc)
}
}
解决方案
/*
tcpclientwithreconnect
*/
packagemain
import(
"net"
"fmt"
"bufio"
"time"
)
funcdoTask(connnet.Conn){
for{
fmt.Fprintf(conn,"testmsg\n")
msg,err:=bufio.NewReader(conn).ReadString('\n')
iferr!=nil{
fmt.Println("recvdataerror")
break
}else{
fmt.Println("recvmsg:",msg)
}
time.Sleep(1*time.Second)
}
}
funcmain(){
hostInfo:="127.0.0.1:12345"
for{
conn,err:=net.Dial("tcp",hostInfo)
fmt.Print("connect(",hostInfo)
iferr!=nil{
fmt.Println(")fail")
}else{
fmt.Println(")ok")
deferconn.Close()
doTask(conn)
}
time.Sleep(3*time.Second)
}
}
运行效果:
[root@localt1]#./tcpClient1 connect(127.0.0.1:12345)ok recvmsg:2017-06-1221:10:32.110977137+0800CST recvmsg:2017-06-1221:10:33.111868746+0800CST recvdataerror connect(127.0.0.1:12345)fail connect(127.0.0.1:12345)fail connect(127.0.0.1:12345)ok recvmsg:2017-06-1221:10:43.117203432+0800CST recvmsg:2017-06-1221:10:44.11853427+0800CST
讨论
这里只是个简单的示例代码,实现了tcp自动重连。
好,就这些了,希望对你有帮助。
以上这篇golang之tcp自动重连实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。