golang之tcp自动重连
操作系统: CentOS 6.9_x64
go语言版本: 1.8.3
问题描述
现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动重连。
测试服务器示例代码:
- /*
- tcp server for test
- E-Mail : Mike_Zhang@live.com
- */
- package main
- import (
- "fmt"
- "net"
- "os"
- "strings"
- "time"
- )
- func checkError(err error) {
- if err != nil {
- fmt.Println(err)
- os.Exit()
- }
- }
- func handleClient(conn net.Conn) {
- conn.SetReadDeadline(time.Now().Add( * time.Minute))
- request := make([]byte,)
- defer conn.Close()
- for {
- recv_len,err := conn.Read(request)
- if err != nil {
- fmt.Println(err)
- break
- }
- if recv_len == {
- 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,)
- }
- }
- 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
- E-Mail : Mike_Zhang@live.com
- */
- 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( * 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( * time.Second)
- }
- }
运行效果:
- [root@local t1]# ./tcpClient1
- connect (127.0.0.1:) ok
- recv msg : -- ::32.110977137 + CST
- recv msg : -- ::33.111868746 + CST
- recv data error
- connect (127.0.0.1:) fail
- connect (127.0.0.1:) fail
- connect (127.0.0.1:) ok
- recv msg : -- ::43.117203432 + CST
- recv msg : -- ::44.11853427 + CST
讨论
这里只是个简单的示例代码,实现了tcp自动重连。
好,就这些了,希望对你有帮助。
本文github地址:
https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170613_golang之tcp自动重连.rst
欢迎补充
golang之tcp自动重连的更多相关文章
- python之tcp自动重连
操作系统: CentOS 6.9_x64 python语言版本: 2.7.13 问题描述 现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动重连. 测试服务器示例代 ...
- Netty 自动重连
from: http://www.dozer.cc/2015/05/netty-auto-reconnect.html 自动重连 用 Netty 写 Client 和 Server 的时候必须要去处理 ...
- 解读dbcp自动重连那些事---转载
http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 同样的内容,不同的描述方式,不一 ...
- 解读dbcp自动重连那些事(转)
本文转自:http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 borrow 借,从连 ...
- 解读dbcp自动重连那些事
转载自:http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 同样的内容,不同的描述方 ...
- 解读dbcp自动重连那些事(转)
转自:http://agapple.iteye.com/blog/791943 Hi all : 最近在做 offerdetail 优化时,替换了数据库驱动,从 c3p0 0.9.1 -> db ...
- TODO:Golang语言TCP/UDP协议重用地址端口
TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...
- 如何实现Azure虚拟网络中点到站VPN的自动重连
在Windows Azure早期版本中,用户要在某台Azure平台之外的机器与Azure平台内部的机器建立专用连接,可以借助Azure Connect这个功能.当前的Azure版本,已经没有Az ...
- PERL DBI 自动重连问题
[root@wx03 mojo]# cat relink.pl use Mojolicious::Lite; use JSON qw/encode_json decode_json/; use Enc ...
随机推荐
- ifram 取父窗体的URL地址
var url=''; try { url = window.top.document.referrer ; } catch(M) { if (window.parent) ...
- mongodb centos7上的安装
1,下载安装包 下载mongoDB的安装文件地址:https://www.mongodb.org/downloads#production 选择Linux 64-bit legacy 版本,下载到目标 ...
- 低版本系统兼容的ActionBar(四)添加Tab+添加自定义的Tab视图+Fragment
在ActionBar中添加Tab是很有用的技巧.在support V7库的支持下,我们几乎可以用和之前一样的方式来添加Tab,对于Tab来说,我们可以和MenuItem一样,给他定义自己的视图.我这里 ...
- C# Linq获取两个List或数组的差集交集
List<); list1.Add(); list1.Add(); List<); list2.Add(); list2.Add(); //得到的结果是4,5 即减去了相同的元素. L ...
- [Web 前端] 使用yarn代替npm作为node.js的模块管理器
cp from : https://www.jianshu.com/p/bfe96f89da0e Fast, reliable, and secure dependency managemen ...
- JUnit4单元测试入门教程
本文按以下顺序讲解JUnit4的使用 下载jar包 单元测试初体验 自动生成测试类 执行顺序 @Test的属性 下载jar包## 下载地址 在github上,把以下两个jar包都下载下来. 下 ...
- 统计学中RR OR AR HR的区别
一.相对危险度(RR)——队列研究中分析暴露因素与发病的关联程度 队列研究是选择暴露及未暴露于某一因素的两组人群,追踪其各自的发病结局,比较两组发病结局的差异,从而判定暴露因素与疾病有无关联及关联大小 ...
- 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 ...
- RxJava RxBinding RxView 控件事件 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 强化学习之Q-learning简介
https://blog.csdn.net/Young_Gy/article/details/73485518 强化学习在alphago中大放异彩,本文将简要介绍强化学习的一种q-learning.先 ...