本文使用两种方式测试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 客户端接收数据超时的更多相关文章

  1. Java Socket 服务端发送数据 客户端接收数据

    服务端: package com.thinkgem.wlw.modules.api.test.socket; /** * @Author: zhouhe * @Date: 2019/4/8 9:30 ...

  2. SSH服务器与Android通信(2)--Android客户端接收数据

    基本原理是Android客户端通过HttpClient向服务器发出请求,服务器向Android客户端返回JSON字符串,Android客户端解析JSON字符串获得数据. 1. 新建一个Android项 ...

  3. Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码

    主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码: #include <stdio.h> #include <sys/types. ...

  4. 关于原子哥ENC28J60网络通信模块接收数据代码的一点疑惑

    ---恢复内容开始--- 这几天做STM32的ENC28J60网络通信模块,自己在原子哥的代码上进行修改测试,,发现一个问题,电脑和板子进行通信的时候总隔一段时间板子就死机了. 使用自己的就不会死机, ...

  5. 灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据

    灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据 目录: 1.MM32F0010UART简介 2.MM32F0010UART特性 3.MM32F0010使用 ...

  6. 【实验室笔记】C#的Socket客户端接收和发送数据

    采用socket发送和接收数据的实验中,服务器采用的是网络助手作为模拟服务器端. 客户端程序流程: 应用的命名空间: using System.Net; using System.Net.Socket ...

  7. Unary模式下客户端从开始连接到发送接收数据的主要流程

    (原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient grpc Unary模式下客户端从开始连接到发送数据的主要流程 graph TD; ...

  8. 【Java】学习路径60-利用TCP协议接收多个客户端的数据

    import java.io.IOException; import java.net.*; public class TCP_Server { public static void main(Str ...

  9. 使用netty4.x客户端接收较大数据量报文时发生的读取不完整bug修复记录

    1.先说问题 背景:服务是运行在Linux上的安全网关提供的,TCP协议发送 通过二进制编码的xml字符串 报文,报文头的第一个字段是int类型的表示字节序标记,第二个字段是int类型的表示整个报文长 ...

随机推荐

  1. dict的几个要点

    1. 采用key,value键-值对进行存储 2. key必须是不可变对象 3. key值不能重复 添加元素: aDict = {'1':'aaa','b':'bbb','3':'ccc'} aDic ...

  2. 2—ARM中的异常中断

    ARM体系中的3种控制程序执行的方式 正常执行过程中,每执行1条ARM指令,PC的值加4个字节:每执行1条Thumb指令,PC的值加2个字节.整个过程按照顺序执行. 通过跳转指令,调到特定的地址开始执 ...

  3. 如何在linux环境安装JDK

    1. 到JDK官网下载相应的安装包 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...

  4. Java - Java入门(2-1am)

    第一讲.Java入门 1. 计算机语言是人和计算机进行交互的一种工具,人们通过使用计算机语言编写程序来向计算机施令,计算机则执行程序,并把结果输出给用户. 2. 机器语言:由0.1序列构成的指令码组成 ...

  5. myls

    #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unist ...

  6. CSS效果:checkbox点选效果

    HTML: <html lang="en"> <head> <meta charset="UTF-8"> <meta ...

  7. WebService中用CXF框架的wsdl部署生成客户端代码时,使用cmd命令口出现wsimport不是内部或外部命令的问题

    网上有很多,都不好用,这个立竿见影的 set JAVA_HOME = *:\Program Files\Java\jdk1.8.0_181(此处为自己jdk的安装路径) set CLASSPATH = ...

  8. 删除Docker镜像

    删除镜像:1)先杀死镜像中所有容器   docker kill $(docker ps -a -q)2)删除镜像中所有容器:   docker rm $(docker ps -a -q)3)删除镜像: ...

  9. Spring 基于set方法的依赖注入

    注意,再次强调,注入一个值用value,注入一个引用,要使用    ref   来注入 同时,注入的对象,要有set和get方法,才能通过方法注入. <?xml version="1. ...

  10. iOS 九宫格解锁

    思路: 1.画9个按钮,通过按钮的选中状态控制按钮. 2.连线通过贝塞尔曲线绘制. 3.校验密码通过给按钮绑定tag值判断. 主要代码: OC版本: // // NineLockView.m // l ...