在TCP连接的客户端,我试图尽可能地重用已建立的连接,以避免每次需要连接时都拨号的开销。从根本上讲,这是连接池,尽管技术上,我的池大小恰好为1。
我遇到的问题是,如果连接闲置时间过长,另一端会断开连接。我尝试使用以下内容来保持连接活动状态:
但这并没有起到帮助的作用。事实上,它会导致我的连接更快关闭。我相当确定这是因为(在Mac上),这意味着在30秒后开始探测连接健康状况,然后每隔30秒进行8次探测。服务器端不支持keepalive,因此在4分30秒后,客户端会断开连接。
也许我无法永久保持空闲连接处于活动状态,如果有一种方法可以至少检测连接是否已关闭,那就完全没问题了,这样我就可以顺利地用新连接替换它。可惜的是,即使阅读了所有文档并在博客圈中寻找帮助,我也找不到任何一种方法在go中查询TCP连接的状态。
必须有一种方法。有人知道如何实现吗?非常感谢提供帮助的人!
编辑:
理想情况下,我希望学习如何使用纯go处理这个问题--而不使用第三方库来完成。当然,如果有一些库可以做到这一点,我也不介意被指向它们,以便我可以看看它们是如何做到的。
我遇到的问题是,如果连接闲置时间过长,另一端会断开连接。我尝试使用以下内容来保持连接活动状态:
err = conn.(*net.TCPConn).SetKeepAlive(true)
if err != nil {
fmt.Println(err)
return
}
err = conn.(*net.TCPConn).SetKeepAlivePeriod(30*time.Second)
if err != nil {
fmt.Println(err)
return
}
但这并没有起到帮助的作用。事实上,它会导致我的连接更快关闭。我相当确定这是因为(在Mac上),这意味着在30秒后开始探测连接健康状况,然后每隔30秒进行8次探测。服务器端不支持keepalive,因此在4分30秒后,客户端会断开连接。
也许我无法永久保持空闲连接处于活动状态,如果有一种方法可以至少检测连接是否已关闭,那就完全没问题了,这样我就可以顺利地用新连接替换它。可惜的是,即使阅读了所有文档并在博客圈中寻找帮助,我也找不到任何一种方法在go中查询TCP连接的状态。
必须有一种方法。有人知道如何实现吗?非常感谢提供帮助的人!
编辑:
理想情况下,我希望学习如何使用纯go处理这个问题--而不使用第三方库来完成。当然,如果有一些库可以做到这一点,我也不介意被指向它们,以便我可以看看它们是如何做到的。