golang socket网络波动重连机制,心跳

golang socket网络波动重连机制,心跳,第1张

client代码

package main

import (
	"fmt"
	"net"
	"time"
)

/**
socket 连接
*/
func main() {
	for {
		conn, err := net.Dial("tcp", "localhost:8090")
		if err != nil {
			fmt.Printf("socket error[Dial] %s", err.Error())
		} else {
			var d string
			d = "Hello paofu!!"
			conn.Write([]byte(d))
			fmt.Println("Connected to localhost:8090")
			defer func() { _ = conn.Close() }()

			go func() { // 定时心跳任务 每30妙
				for {
					time.Sleep(time.Second * 30)
					if !sendSocket(conn, "ping") {
						break
					}
				}

			}()
			response := make([]byte, 1024)
			for {
				n, err := conn.Read(response)
				if err != nil {
					fmt.Printf("socket error[Read] %s", err.Error())
					break
				}
				msg := string(response[:n])
				fmt.Printf("socket receive %s", msg)
				if err = conn.SetReadDeadline(time.Now().Add(time.Minute * 1)); err != nil { // 重置超时时间
					fmt.Printf("socket error[SetReadDeadline] %s", err.Error())
					return
				}
			}

			// if err := conn.SetReadDeadline(time.Now().Add(time.Minute * 1)); err != nil { // 设置超时2分钟
			// 	fmt.Printf("socket error[SetReadDeadline] %s", err.Error())
			// 	return
			// }

		}
		time.Sleep(time.Second * 3)
	}

}

/**
发送数据
*/
func sendSocket(conn net.Conn, data string) bool {
	if err := conn.SetWriteDeadline(time.Now().Add(time.Second * 30)); err != nil {
		fmt.Printf("socket error[SetWriteDeadline] %s", err.Error())
		return false
	}
	if _, err := conn.Write([]byte(data)); err != nil {
		fmt.Printf("socket error[Write] %s", err.Error())
		return false
	}
	fmt.Printf("socket send %s", data)
	return true
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/994914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存