java?HttpURLConnection類的disconnect方法與http長連接詳解
disconnect方法
java 自帶的HttpURLConnection類有個關(guān)閉連接的方法disconnect(),是用于關(guān)閉http連接的,但是有一個問題在于,http連接一直都是一次性的,不存在復(fù)用的可能性,所以當輸入流和輸出流關(guān)閉后,http請求過程也就結(jié)束了,為什么還需要這個方法?
java代碼對該方法的說明如下:并沒有提到關(guān)閉請求釋放資源的說明,而是說調(diào)用該方法意味著一段時間之內(nèi)不會再向目標機器發(fā)起請求,并且又強調(diào)了一遍HttpURLConnection類是不可復(fù)用的。
看到這段描述,我就想到了該方法應(yīng)該是和長連接有關(guān)的。
/** * Indicates that other requests to the server * are unlikely in the near future. Calling disconnect() * should not imply that this HttpURLConnection * instance can be reused for other requests. */ public abstract void disconnect();
http長連接
在http1.1版本以及之后的相關(guān)版本中,connection默認是keep-alive,意思即是在http請求結(jié)束后保持tcp連接不斷開以便下一次請求復(fù)用,也就是http長連接,但是著要求請求放和服務(wù)端都支持,所以有理由懷疑disconnect()方法與http長連接有關(guān),但是著需要驗證。
http長連接測試
為此搭建了一個簡易spring boot項目作為測試,這里http協(xié)議使用是1.1版本,默認保持長連接模式。首先看一下正常的http請求過程中tcp連接狀態(tài)的變化。
注:因為發(fā)起請求的一方在請求結(jié)束后程序就關(guān)閉了,所以不管有沒有調(diào)用斷開連接的方法,tcp連接都會在程序結(jié)束后斷開。

在發(fā)起http請求后確立tcp連接,由于是本地調(diào)用,所以能看到有兩個tcp連接記錄,但是其實是同一個鏈接。
在程序結(jié)束后發(fā)起tcp請求的一方斷開了鏈接,接受的一方進入了TIME_WAIT狀態(tài),這是防止丟包的準備關(guān)閉連接的狀態(tài)。
然后在調(diào)用方加上了Thread.sleep()方法,讓調(diào)用方發(fā)起請求后程序不結(jié)束。
但是發(fā)現(xiàn)不管有沒有有執(zhí)行disconnect()方法,tpc連接的狀態(tài)都是一樣的,就是在http請求結(jié)束后的一段時間內(nèi),tcp連接依然是確認狀態(tài),在持續(xù)數(shù)十秒后,tcp連接就關(guān)閉了,并沒有發(fā)現(xiàn)監(jiān)聽狀態(tài)。

結(jié)論
并沒有發(fā)現(xiàn)HttpURLConnection類的disconnect()方法在保持http長連接中有任何作用(也有可能是spring boot服務(wù)需要專門設(shè)計才能支持長連接),似乎該方法本身就沒有任何作用。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Java將DOCX文檔解析為Markdown文檔的代碼實現(xiàn)
在現(xiàn)代文檔處理中,Markdown(MD)因其簡潔的語法和良好的可讀性,逐漸成為開發(fā)者、技術(shù)寫作者和內(nèi)容創(chuàng)作者的首選格式,然而,許多文檔仍然以Microsoft Word的DOCX格式保存,本文將介紹如何使用Java和相關(guān)庫將DOCX文檔解析為Markdown文檔,需要的朋友可以參考下2025-04-04
Springboot之restTemplate配置及使用方式
這篇文章主要介紹了Springboot之restTemplate配置及使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
SpringBoot實現(xiàn)WebSocket的示例代碼
這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)WebSocket的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
Java中transient關(guān)鍵字的詳細總結(jié)
本文要介紹的是Java中的transient關(guān)鍵字,transient是短暫的意思。對于transient 修飾的成員變量,在類的實例對象的序列化處理過程中會被忽略,感興趣的朋友可以參考閱讀2023-04-04

