- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
12.10.2 服务端设置超时时间
在这小节,您将学习如何在服务端超时连接。您需要这样做,因为有时客户端结束 HTTP 连接的时间比预期的要长得多。这通常由于俩个原因而发生:第一个原因是客户端软件有 bug,第二个原因是服务进程正经历攻击!
在 serverTimeOut.go
源码文件中实现了这个技巧,并分四部分介绍。
serverTimeOut.go
的第一部分如下:
package main
import (
"fmt"
"net/http"
"os"
"time"
)
func myHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Serving: %s\n", r.URL.Path)
fmt.Fprintf("Served: %s\n", r.Host)
}
serverTimeOut.go
的第二部分代码如下:
func timeHandler(w http.ResponseWriter, r *http.Request) {
t := time.Now().Format(time.RFC1123)
Body := "The current time is:"
fmt.Fprintf(w, "<h1 align=\"center\">%s</h1>", Body)
fmt.Fprintf(w, "<h2 align=\"center\">%s</h2>n", t)
fmt.Fprintf(w, "Serving: %s\n", r.URL.Path)
fmt.Printf("Served time for :%s\n", r.Host)
}
serverTimeOut.go
的第三段代码如下:
func main() {
PORT := ":8001"
arguments := os.Args
if len(arguments) == 1 {
fmt.Printf("Listening on http://0.0.0.0%s\n", PORT)
} else {
PORT = ":" + arguments[1]
fmt.Printf("Listening on http://0.0.0.0%s\n", PORT)
}
m := http.NewServeMux()
srv := &http.Server {
Addr: PORT,
Handler: m,
ReadTimeout: 3 * time.Second,
WriteTimeout: 3 * time.Second,
}
在这个例子中,我们使用 http.Server
结构, 它的字段支持两类超时。第一个叫 ReadTimeout
,第二个叫 WriteTimeout
。ReadTimeout
字段的值定义读取整个请求,包括消息体的最大持续时间。
WriteTimeout
字段的值定义超时写入响应之前的最大持续时间。简单说,这是从请求头读取结束到响应写入结束的时间。
serverTimeOut.go
的剩余代码如下:
m.HandleFunc("/time". timeHandler)
m.HandleFunc("/", myHandler)
err := srv.ListenAndServe()
if err != nil {
fmt.Println(err)
return
}
}
我们现在执行 serverTimeOut.go
,使用 nc(1)
与之交互。
$ go run serverTimeOut.go
Listening on http://0.0.0.0:8001
在 nc(1)
部分(在这个例子中作为一个虚拟 HTTP 客户端),您应该发出下一个命令来连接到 serverTimeOut.go
:
$ time nc localhost 8001
real 0m3.012s
user 0m0.001s
sys 0m0.002s
由于我们没有发出任何命令,HTTP 服务器结束了连接。time(1)
程序的输出验证了服务器关闭连接所用时间。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论