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类型的表示整个报文长 ...
随机推荐
- Oracle学习DayThree
一.视图 1.定义: 视图是一种虚表,是从表中抽出的逻辑上相关的数据集合. 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表. 向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解 ...
- python笔记3——字符串的操作
#Author:Wildwolf name="my name is wildwolf ," print(name.capitalize()) #首字母大写 print(name.c ...
- 命令行窗口中使用pip安装第三方库成功之后,在pycharm中仍不能使用
在学习廖老师的Python教程的时候,遇到命令行窗口中使用pip安装第三方库成功之后,在pycharm中仍不能使用的情况, 这种情况可能是由于在本地安装了多个Python版本的缘故(只是可能的情况之一 ...
- Oracle中计算两个日期时间的差
--方法1 select floor((sysdate - to_date('2006-09-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss'))) as sDays fro ...
- Linux-1-用户管理
目录: 用户账号的添加.删除与修改 用户口令的管理 用户组的管理 总结用户与用户组常用命令 ***用户账号的添加.删除与修改*** 添加用户:useradd 选项 用户名 选项: -c comme ...
- Spring - AOP简介与图示
[1]AOP (Aspect-Oriented Programming, 面向切面编程),是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) ...
- 安装系统后IP配置问题
1.配置静态IP 在/etc/sysconfig/network-script/ifcfg-eth0 文件,网卡管理文件.修改为静态IP.IPADDR.网关.掩码等 同一台机器上的网卡不能配置在同一网 ...
- Ubuntu 16.04 环境下配置apache2.4 + php5.6
相信用惯了Windows的朋友一开始接触Linux是很崩溃的,因为很多东西都是通过命令行来完成的,包括安装绝大多数的开发工具以及环境,那么在Ubuntu下其实可以直接通过apt-get指令来安装apa ...
- Linux 学习之路 --------ip地址虚拟网络
// ifconfig 查看IP地址 网络信息 我的IP 39.161.136.25 ① 为网卡临时配置IP地址 ifconfig eth0 39.161.136.5 (netmask ...
- 前端自定义format函数,做字符串格式化功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...