操作系统: CentOS 6.9_x64
go语言版本: 1.8.3
问题描述
现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动重连。
测试服务器示例代码:
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) } }
解决方案
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]# http://www.jsgho.com/help/fwq/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
- 下一篇: 玩家必备精趣够级大众棋牌有挂吗【抖音视频】
- 上一篇: 为什么微信猎手一直正在载入中登陆不了怎么办