Golang中Net包的Dialer Keep Alive字段问题解析

Golang中Net包的Dialer Keep Alive字段问题解析 最近在学习使用Golang建立TCP客户端和服务器。我想确保TCP连接在特定空闲时间后会被关闭,因此使用了Dialer对象,并将KeepAlive字段设置为我想要的时间。然而,经过一些测试后,即使客户端和服务器都不进行任何操作,TCP连接仍然保持存在。

客户端:

package main

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

func main(){
	d := &net.Dialer{KeepAlive: 1 * time.Second}
	fmt.Println("Launching Client ...")
	conn, err := d.Dial("tcp", "127.0.0.1:8081")
	time.Sleep(10 * time.Second)
	fmt.Println("Connection Established ...")
	if err != nil {
		fmt.Println("Error:", err)
	}
	// 每秒发送消息
	for {
		text := "Send a test to server through TCP"
		time.Sleep(time.Second)
		// 发送到套接字
		_, err := fmt.Fprintf(conn, text + "\n")
		if err != nil {
			fmt.Println("ERROR:", err)
		}
	}
}

服务器:

package main

import "net"
import "fmt"
import "bufio"
// 仅用于示例处理

func main() {

	fmt.Println("Launching server...")

	// 监听所有接口
	ln, _ := net.Listen("tcp", ":8081")

	// 接受端口连接
	conn, _ := ln.Accept()

	// 永久运行循环(直到ctrl-c)
	for {
		// 监听以换行符结尾的消息
		message, _ := bufio.NewReader(conn).ReadString('\n')
		// 输出接收到的消息
		fmt.Print("Message Received:", string(message))
		// 对接收字符串的示例处理
		//newmessage := strings.ToUpper(message)
		//// 将新字符串发送回客户端
		//conn.Write([]byte(newmessage + "\n"))
	}
}

任何帮助都将不胜感激。谢谢。


更多关于Golang中Net包的Dialer Keep Alive字段问题解析的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

zmxsyn:

即使客户端和服务器端什么都不做

你从客户端发送了什么内容吗?这是你使用的完整代码吗?

更多关于Golang中Net包的Dialer Keep Alive字段问题解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


zmxsyn:

time.Sleep(10 * time.Second)

感谢回复。客户端每秒向服务器发送消息。但在开始发送消息之前,我让它休眠了10秒,这超过了我为拨号器指定的KeepAlive时间。是的,这就是我拥有的完整代码。

感谢您的帮助。我想了解 Dialer 中指定的 “KeepAlive” 字段的含义。根据我的理解,“KeepAlive” 字段指定了连接在特定时间段内保持开启的时长。在我指定的时间之后,连接将会断开,客户端和服务器之间的通信将被禁止,除非重新建立连接。

作为替代保持连接存活的方法,您可以使用 conn.SetReadDeadline(在服务器端)和 conn.SetWriteDeadline(在客户端)。

顺便说一下,您还需要在每次活动发生时不断重新设置这些截止时间。如果不设置它们,在给定时间段内没有任何活动时连接将会超时。当连接超时后,如果您尝试读取或写入连接,将会收到超时错误,此时您需要手动关闭连接(这是因为具体行为取决于操作系统)。

我想了解 Dialer 中 “KeepAlive” 字段的含义。根据我的理解,“KeepAlive” 字段指定了连接在特定时间段内保持打开的时间。在我指定的时间之后,连接将断开,客户端和服务器之间的通信将被禁止,除非重新建立连接。

不,并非如此。Keep-Alive 是作为底层机制来检测其中一方是否仍然存在。但是,你不能使用 keep-alive 选项来检测连接方是否曾经进行过通信。点击此处了解更多

我想确保 TCP 连接在一定的无活动时间后关闭。

在你的情况下,你的目标是在达到某个时间阈值后断开连接。为此,你需要构建一个心跳机制。你可以使用 XXXDeadline 函数轻松构建该机制。或者你也可以使用自己的计时器,这取决于你。

回到顶部