HTTP 客户端接收数据超时
本文使用两种方式测试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,连接已经不存在。
HTTP 客户端接收数据超时的更多相关文章
- Java Socket 服务端发送数据 客户端接收数据
服务端: package com.thinkgem.wlw.modules.api.test.socket; /** * @Author: zhouhe * @Date: 2019/4/8 9:30 ...
- SSH服务器与Android通信(2)--Android客户端接收数据
基本原理是Android客户端通过HttpClient向服务器发出请求,服务器向Android客户端返回JSON字符串,Android客户端解析JSON字符串获得数据. 1. 新建一个Android项 ...
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码: #include <stdio.h> #include <sys/types. ...
- 关于原子哥ENC28J60网络通信模块接收数据代码的一点疑惑
---恢复内容开始--- 这几天做STM32的ENC28J60网络通信模块,自己在原子哥的代码上进行修改测试,,发现一个问题,电脑和板子进行通信的时候总隔一段时间板子就死机了. 使用自己的就不会死机, ...
- 灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据
灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据 目录: 1.MM32F0010UART简介 2.MM32F0010UART特性 3.MM32F0010使用 ...
- 【实验室笔记】C#的Socket客户端接收和发送数据
采用socket发送和接收数据的实验中,服务器采用的是网络助手作为模拟服务器端. 客户端程序流程: 应用的命名空间: using System.Net; using System.Net.Socket ...
- Unary模式下客户端从开始连接到发送接收数据的主要流程
(原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient grpc Unary模式下客户端从开始连接到发送数据的主要流程 graph TD; ...
- 【Java】学习路径60-利用TCP协议接收多个客户端的数据
import java.io.IOException; import java.net.*; public class TCP_Server { public static void main(Str ...
- 使用netty4.x客户端接收较大数据量报文时发生的读取不完整bug修复记录
1.先说问题 背景:服务是运行在Linux上的安全网关提供的,TCP协议发送 通过二进制编码的xml字符串 报文,报文头的第一个字段是int类型的表示字节序标记,第二个字段是int类型的表示整个报文长 ...
随机推荐
- hadoop2.6.0高可靠及yarn 高可靠搭建
以前用hadoop2.2.0只搭建了hadoop的高可用,但在hadoop2.2.0中始终没有完成YARN HA的搭建,直接下载了hadoop最新稳定版本2.6.0完成了YARN HA及HADOOP ...
- hive批量删除表
#!/bin/shhive -e "use csxuy;show tables;"|grep product_tour2 | while read linedoecho -n &q ...
- 2016/12/20 dplの课练
1.个人博客的文件,只输出学生姓名 cat 111 |sed 's/[0-9a-zA-Z:/. -]//g' 2.只输出每个学生的url cat 111 |sed 's/.*:\/\///g' 3. ...
- mysqldumpslow简单使用方法-mysqldumpslow详细用法
慢查询日志分析工具mysqldumpslow经常使用的参数:-s,是order的顺序----- al 平均锁定时间-----ar 平均返回记录时间-----at 平均查询时间(默认)-----c 计数 ...
- re模块基本用法和字符集
import re # . 能够替代任意字符 r= re.findall("a..c","abbcsd") print(r) # ^ 找最前面的 r_1 = r ...
- 如何在一台计算机上配置多个jdk【转】
分析问题 为了多快好省的解决当前的问题,我的想法是在windows中同时安装jdk1.6和jdk1.8,在中间进行切换,而不需要多次进行重复的安装和卸载,这样简单方便. 解决思路 第一步:在安装之前, ...
- 关于实时监听input的值得变化的问题
onchange 关于input的onchange事件 其实是有出发条件的 并非实时监听的 1.鼠标点击事件 或者键盘事件(tab和wins键都可以触发 enter在ie9时不触发,火狐和ch ...
- (a ==1 && a== 2 && a==3) 有可能是 true 吗?
工作之余逛知乎的时候看到一个有意思的讨论,(a ==1 && a== 2 && a==3) 有可能是 true 吗?啊?一个变量同时满足三个条件?扯呢? 当然是我太天真 ...
- 华莱士的 第二个python程序之(格式化输出)
name = input("name:")age = input("age:")info ='''---------- info of %s --------- ...
- git教程:远程仓库
转自:远程仓库 到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了. 可是有用过集中式版本控制系统SVN的童鞋会站出来说,这些功能在SVN里早就 ...