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类型的表示整个报文长 ...
随机推荐
- python 游戏 —— 汉诺塔(Hanoita)
python 游戏 —— 汉诺塔(Hanoita) 一.汉诺塔问题 1. 问题来源 问题源于印度的一个古老传说,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆 ...
- shell中特殊位置参数变量
shell中特殊位置参数变量:$0.$n.$#.$*.$@ $0:获取当前执行shell脚本文件名,如果执行脚本包含路径,那么就包括脚本路径 $n:获取当前执行shell脚本的第n个参数值.n=1.. ...
- oraclesql语句笔记
1. ORA-00947:Not enough values 原因:values没有写足够的值与select()中的字段对应 2.查看一张表中共有多少个字段 select count(*) from ...
- windows10安装anaconda,配置tensorflow
1.安装anaconda 3.5.5 默认安装,注意,把添加到path勾选上,其他默认安装(能搜到这篇文章,相信大家都有过变成经验,这些环境变量的重要性就不要窝在多说了) 2.以管理员身份,打开ana ...
- sklearn中树模型可视化的方法
在机器学习的过程中,我们常常会用到树模型的方式来解决我们的问题.在工业界,我们不仅要针对某个问题利用机器学习的方法来解决问题,而且还需要能力解释其中的原理或原因.今天主要在这里记录一下树模型是怎么做可 ...
- OpenGL绘制一个四边形
学习自:https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/ OpenGL没有直接绘制四边形的a ...
- VS2010 配置与调试
一.VS2010项目属性配置 使用VS调试程序,出现错误:"无法启动程序"***\**.exe".系统找不到指定的文件".网上找来解决办法, 也未能解决,但这些 ...
- xpath | 计算两个节点集
url = li.xpath("./div/div[2]/a/@href | ./div/div[2]/div[2]/a/@href").extract_first()
- Scrapy创建项目问题
创建项目时报错 ModuleNotFoundError: No module named 'cryptography.hazmat.bindings._constant_time' pip insta ...
- reat + cesium。 实现 初始化时自动定位,鼠标移动实时展示坐标及视角高度, 淹没分析
只贴实现淹没分析这块的代码. import styles from './cesium.less'; import React from 'react'; import Cesium from 'ce ...