在Golang中可以通过设置deadline实现网络连接的超时处理。deadline可用于TCP连接、HTTP请求等网络操作。
例如,TCP连接的超时处理:
conn, err := net.DialTimeout("tcp", "127.0.0.1:8000", 3*time.Second)
// 3秒钟内建立TCP连接
if err != nil {
if err, ok := err.(net.Error); ok && err.Timeout() {
fmt.Println("connection timeout")
} else {
fmt.Println(err)
}
}
HTTP请求的超时处理:
client := &http.Client{
Timeout: 3 * time.Second, // 3秒钟内完成HTTP请求
}
resp, err := client.Get("http://127.0.0.1:8000/")
if err != nil {
if err, ok := err.(net.Error); ok && err.Timeout() {
fmt.Println("request timeout")
} else {
fmt.Println(err)
}
}
我们也可以为已建立的TCP连接或HTTP客户端设置deadline:
conn, err := net.Dial("tcp", "127.0.0.1:8000")
// 建立连接
err = conn.SetDeadline(time.Now().Add(3 * time.Second))
// 3秒钟内完成某个操作,否则超时
if err != nil {
fmt.Println(err)
}
_, err = conn.Read(make([]byte, 1024))
// 读操作
if err != nil {
if err, ok := err.(net.Error); ok && err.Timeout() {
fmt.Println("read timeout")
} else {
fmt.Println(err)
}
}
实现网络连接的超时处理,可以避免系统资源长时间被hang住,保证系统的稳定性。因此掌握超时处理的方法是网络编程的基本要求。