本文使用两种方式测试HTTP 客户端读数据超时的情况,一种是直接使用golang自带的http库,另一种是使用martini web框架。

1. 测试1--直接使用http库

1.1.启动server

server端的请求响应函数,会睡眠10s,再返回结果。这样,可以模拟server端处理慢的情况。

package  main

import (
"log"
"net/http"
"time"
) func main() {
http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe(":3000", nil))
} func handler(w http.ResponseWriter, r *http.Request){
log.Println("start...")
time.Sleep(10*time.Second)
w.Write([]byte("Hello world"))
log.Println("end...")
}

1.2.client发起请求

使用curl 发起请求,最大等待时间3s

curl -m 3 http://localhost:3000/
curl: (28) Operation timed out after 3000 milliseconds with 0 bytes received

3s后,超时退出

1.3.server端输出

 ./server
2019/04/11 10:17:28 start...
2019/04/11 10:17:38 end...

handler()等待10s后返回。

没有其他报错。

连接建立后,3s时,client断开连接,server端处理函数继续执行,等10s后,返回结果。

通过tcpdump抓包发现,当client断开连接,server端再向client发送数据,会收到RST。

2.测试2--使用框架

使用martini web框架作为HTTP server。

2.1.启动 HTTP server

server 端请求响应函数逻辑同上。

server代码如下:

package main

import (
"log"
"time"
"github.com/go-martini/martini"
) func main() {
m := martini.Classic()
m.Get("/", handler)
m.Run()
} func handler() string{
log.Println("start...") time.Sleep(10*time.Second) log.Println("end...")
return "Hello world!"
}

请求处理函数handler()睡眠10s,然后才返回。

2.2.client发起请求

使用curl 发起请求,最大等待时间3s

curl -m 3 http://localhost:3000/
curl: (28) Operation timed out after 3000 milliseconds with 0 bytes received

3s后,超时退出

2.3.server 端输出

./server
[martini] listening on :3000 (development)
[martini] Started GET / for [::1]:50271
2019/04/11 09:55:33 start...
2019/04/11 09:55:43 end...
[martini] Completed 200 OK in 10.003468104s

handler()等待10s后返回。

没有其他报错。

连接建立后,3s时,client断开连接,server端处理函数继续执行,等10s后,返回结果。

通过tcpdump抓包发现,当client断开连接,server端再向client发送数据,会收到RST。

3.问题:连接已经断开,为什么server返回结果时没有报错?

当client断开连接,server端再向client发送数据,会收到RST。

如果client断开连接后,server连续两次向client发送数据,则第二次向client发送数据时,会报错broken pipe,因为收到RST,连接已经不存在。

最新文章

  1. 个人作业-Week3
  2. MaterialUp - 寻找材料设计灵感必备的网站
  3. SharePoint 站点集和子站点数据互相读取
  4. pythonyCool-moviepy
  5. nginx配置文件结构
  6. 九、DAG hierarchy
  7. detours安装和使用
  8. 条款19 command 模式与好莱坞法则
  9. Xcode 7遇到 App Transport Security has blocked a cleartext HTTP 错误
  10. Cache的Add之委托解说
  11. 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器
  12. 201521123117 《Java程序设计》第9周学习总结
  13. 云主机中毒 cpu爆满解决日志
  14. [转]ERROR: http://rancherserver/v1 is not accessible
  15. MFC通过button控制编辑框是否显示系统时间
  16. Scrapy学习篇(十一)之设置随机User-Agent
  17. Java并发编程(九)并发容器
  18. 怎样使用CSS3媒体查询(Media Queries)制作响应式网站
  19. jquery ligerUI中ligerComboBox 初始值问题
  20. 大数据之superset

热门文章

  1. python的迭代器
  2. FUJI 富士 富仕 串口 N500I N700I 连接
  3. holer实现外网访问本地网站
  4. Windows 2008 asp.net 配置
  5. ElementUI - Table 表头排序
  6. 剑指Offer 60. 把二叉树打印成多行 (二叉树)
  7. Java中String类常用方法(字符串中的子字符串的个数)
  8. erlang开发工具之intellij idea基本使用
  9. java多线程、线程池及Spring配置线程池详解
  10. ES6模板字符串之标签模板