golang之tcp自动重连实现方法
发布时间 - 2026-01-11 01:52:11 点击率:次操作系统: 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自动重连。
好,就这些了,希望对你有帮助。
以上这篇golang之tcp自动重连实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# golang
# tcp
# 重连
# 利用Golang实现TCP连接的双向拷贝详解
# golang 实现tcp转发代理的方法
# Golang 实现Socket服务端和客户端使用TCP协议通讯
# golang中net的tcp服务使用
# Golang通过包长协议处理TCP粘包的问题解决
# Golang 编写Tcp服务器的解决方案
# golang实现简单的tcp数据传输
# Golang实现自己的Redis(TCP篇)实例探究
# Golang TCP网络编程的具体实现
# 给大家
# 是个
# 你有
# 希望能
# 这篇
# 不稳定
# 小编
# 大家多多
# 由于种种原因
# 客户端
# 实现了
# 操作系统
# nil
# error
# err
# handleClient
# Exit
# Println
# strings
# os
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
详解Huffman编码算法之Java实现
Laravel如何创建自定义Facades?(详细步骤)
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
高性能网站服务器部署指南:稳定运行与安全配置优化方案
iOS验证手机号的正则表达式
详解Android——蓝牙技术 带你实现终端间数据传输
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
简历在线制作网站免费版,如何创建个人简历?
iOS UIView常见属性方法小结
EditPlus中的正则表达式 实战(2)
Laravel怎么清理缓存_Laravel optimize clear命令详解
jQuery 常见小例汇总
青岛网站建设如何选择本地服务器?
如何快速搭建高效服务器建站系统?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
Laravel如何配置和使用缓存?(Redis代码示例)
Linux网络带宽限制_tc配置实践解析【教程】
nginx修改上传文件大小限制的方法
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Laravel如何自定义分页视图?(Pagination示例)
MySQL查询结果复制到新表的方法(更新、插入)
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
网站建设整体流程解析,建站其实很容易!
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
Android okhttputils现在进度显示实例代码
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
如何解决hover在ie6中的兼容性问题
制作企业网站建设方案,怎样建设一个公司网站?
java获取注册ip实例
jQuery validate插件功能与用法详解
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
个人网站制作流程图片大全,个人网站如何注销?
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
成都网站制作公司哪家好,四川省职工服务网是做什么用?
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤

