var (
httpClient *http.Client
)
const (
MaxIdleConnections int = 20
RequestTimeout int = 5
)
// init HTTPClient
func init() {
client := &http.Client{
Transport: &http.Transport{
MaxIdleConnsPerHost: MaxIdleConnections,
},
Timeout: time.Duration(RequestTimeout) * time.Second,
}
return client
}
func makeRequest() {
var endPoint string = "https://localhost:8080/doSomething"
req, err := http.NewRequest("GET", ....)
response, err := httpClient.Do(req)
if err != nil && response == nil {
log.Fatalf("Error sending request to API endpoint. %+v", err)
} else {
// Close the connection to reuse it
defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatalf("Couldn't parse response body. %+v", err)
}
log.Println("Response Body:", string(body))
}
}
我在Go中有以下代码。Go使用超文本传输协议保持连接。因此,根据我的理解,httpClient. Do(req)
不会创建新连接,因为Go语言使用默认的持久连接。
>
据我所知,HTTP持久连接一次只能发出一个请求,即第二个请求只能在第一次响应之后发出。然而,如果多个线程调用makeRequest()
会发生什么?将httpClient。(req)
在前一个请求得到响应之前是否发送另一个请求?
我假设服务器超时了客户端建立的任何保持活动的连接。如果服务器超时,那么下一次httpClient。如果调用Do(req)
,它会建立新的连接吗?
它不会影响http保持活动连接,根据您的代码,您使用的是全局httpClient,如果按预期在多个线程中调用,这将不会创建新连接,而且它会读取响应。车身关闭前
。如果提供了响应。Body
是一个io。Closer
,它将在请求后关闭。
一个http。客户机
有一个传输
,它向该传输委托了许多发出请求的低级细节。你可以通过给你的客户一个定制的传输来改变几乎任何事情。这个答案的其余部分主要假设您使用的是http。DefaultClient
或至少是一个具有http的客户端。默认传输
。
发出新请求时,如果与适当服务器的空闲连接可用,传输将使用它。
如果没有可用的空闲连接(因为从来没有一个,或者因为其他goroutines正在使用它们,或者因为服务器关闭了连接,或者有一些其他错误),那么传输将考虑建立一个新的连接,受MaxConnsPerHost
的限制(默认:无限制)。如果MaxConnsPerHost
将被超过,则请求将阻塞,直到现有请求完成并有连接可用。否则,将为此请求建立一个新连接。
请求完成后,客户端将缓存连接以供以后使用(受MaxIdleConns
和maxidleconsperhost
限制;DefaultTransport
在全局范围内限制100个空闲连接,每个主机不受限制)。
如果空闲连接不用于发出请求,则在idlecontimeout
之后将关闭它们;对于DefaultTransport
而言,限制为90秒。
所有这一切都意味着,默认情况下,Go将创建足够的连接来满足并行性(达到您可以调整的特定限制),但它也将通过在一段时间内维护一个空闲连接池,尽可能地重用保持活动的连接。
问题内容: 我正在使用POST方法。我需要创建一次,并且应该使用Keep Alive Connection。但是我认为,它每次都会建立一个新的连接。 因此,我需要使用 保持活动 连接。 这是我的代码段,很多帮助将不胜感激。 而且logcat日志是: 问题答案: 10:07:29.746:D / org.apache.http.headers(1529):>>连接:保持活动 您正在要求保持活动状态。
问题内容: 我有一个jQuery Ajax调用,如下所示: 我有这样的Flask方法: tcpdump显示HTTP对话框: 但是,Flask回复时没有保持活动状态。 确实没有实施保持活动的情况吗? 问题答案: Werkzeug的集成Web服务器基于Python标准库的BaseHTTPServer构建。如果将HTTPHTTP协议版本设置为1.1,则BaseHTTPServer似乎支持Keep- Al
所以HTTP。1版本及以上版本支持持久性连接。 现在,我们正在创建一个Rest应用程序,它应该是无状态的。我们一次限制连接的数量。 但如果我仔细阅读HTTP1.0文档,这种方法似乎有问题。 它说服务器将保持连接打开,除非客户端说关闭。 所以,我的问题是如果客户端没有关闭怎么办?如果连接始终处于活动状态,它可能会给我拒绝服务错误。 什么是jetty的默认超时,我如何配置它?我无法找到合适的留档。
HTTP/1.1服务器默认为连接头的保持活动设置。那么,为什么大多数浏览器在其请求中都包含Connection:Keep-Alive,即使它们知道目标服务器支持HTTP/1.1?
我有一个Android应用程序,即时通讯是其中一个关键功能。为了实现IM特性,我们使用基于的推送服务器。 编辑:我曾建议使用前台服务,但下午不喜欢通知托盘总是显示在状态栏,他希望保持干净。 任何建议都将不胜感激!
在另一个主题中,和等Java解决方案中的thread.currentThread().join()的用户被认为是一些评论者可以接受的方法,但有一个评论者说,应该使用一些有用的方法来完成,这些方法可以使线程保持活动,而不是仅仅使它Hibernate。 我理解他的观点,但是如果没有什么事情可以使线程保持活动状态,就像这个例子,我订阅了一个“Topic like”以异步获取消息呢? 使用Thread.C