javasocket超時淺析

javasocket超時淺析

ID:8969906

大小:73.50 KB

頁數(shù):9頁

時間:2018-04-13

javasocket超時淺析_第1頁
javasocket超時淺析_第2頁
javasocket超時淺析_第3頁
javasocket超時淺析_第4頁
javasocket超時淺析_第5頁
資源描述:

《javasocket超時淺析》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。

1、JAVASocket超時淺析套接字或插座(socket)是一種軟件形式的抽象,用于表達兩臺機器間一個連接的“終端”。針對一個特定的連接,每臺機器上都有一個“套接字”,可以想象它們之間有一條虛擬的“線纜”。JAVA有兩個基于數(shù)據(jù)流的套接字類:ServerSocket,服務(wù)器用它“偵聽”進入的連接;Socket,客戶端用它初始一次連接。偵聽套接字只能接收新的連接請求,不能接收實際的數(shù)據(jù)包。套接字是基于TCP/IP實現(xiàn)的,它是用來提供一個訪問TCP的服務(wù)接口,或者說套接字socket是TCP的應(yīng)用編程接口API,通過它應(yīng)用層就可

2、以訪問TCP提供的服務(wù)。在JAVA中,我們用ServerSocket、Socket類創(chuàng)建一個套接字連接,從套接字得到的結(jié)果是一個InputStream以及OutputStream對象,以便將連接作為一個IO流對象對待。通過IO流可以從流中讀取數(shù)據(jù)或者寫數(shù)據(jù)到流中,讀寫IO流會有異常IOException產(chǎn)生。套接字底層是基于TCP的,所以socket的超時和TCP超時是相同的。下面先討論套接字讀寫緩沖區(qū),接著討論連接建立超時、讀寫超時以及JAVA套接字編程的嵌套異常捕獲和一個超時例子程序的抓包示例。1socket讀寫緩沖區(qū)

3、一旦創(chuàng)建了一個套接字實例,操作系統(tǒng)就會為其分配緩沖區(qū)以存放接收和要發(fā)送的數(shù)據(jù)。JAVA可以設(shè)置讀寫緩沖區(qū)的大小-setReceiveBufferSize(intsize),setSendBufferSize(intsize)。向輸出流寫數(shù)據(jù)并不意味著數(shù)據(jù)實際上已經(jīng)被發(fā)送,它們只是被復(fù)制到了發(fā)送緩沖區(qū)隊列SendQ,就是在Socket的OutputStream上調(diào)用flush()方法,也不能保證數(shù)據(jù)能夠立即發(fā)送到網(wǎng)絡(luò)。真正的數(shù)據(jù)發(fā)送是由操作系統(tǒng)的TCP協(xié)議棧模塊從緩沖區(qū)中取數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)來完成的。當有數(shù)據(jù)從網(wǎng)絡(luò)來到時,TCP

4、協(xié)議棧模塊接收數(shù)據(jù)并放入接收緩沖區(qū)隊列RecvQ,輸入流InputStream通過read方法從RecvQ中取出數(shù)據(jù)。2socket連接建立超時socket連接建立是基于TCP的連接建立過程。TCP的連接需要通過3次握手報文來完成,開始建立TCP連接時需要發(fā)送同步SYN報文,然后等待確認報文SYN+ACK,最后再發(fā)送確認報文ACK。TCP連接的關(guān)閉通過4次揮手來完成,主動關(guān)閉TCP連接的一方發(fā)送FIN報文,等待對方的確認報文;被動關(guān)閉的一方也發(fā)送FIN報文,然等待確認報文。正在等待TCP連接請求的一端有一個固定長度的連接隊

5、列,該隊列中的連接已經(jīng)被TCP接受(即三次握手已經(jīng)完成),但還沒有被應(yīng)用層所接受。TCP接受一個連接是將其放入這個連接隊列,而應(yīng)用層接受連接是將其從該隊列中移出。應(yīng)用層可以通過設(shè)置backlog變量來指明該連接隊列的最大長度,即已被TCP接受而等待應(yīng)用層接受的最大連接數(shù)。當一個連接請求SYN到達時,TCP確定是否接受這個連接。如果隊列中還有空間,TCP模塊將對SYN進行確認并完成連接的建立。但應(yīng)用層只有在三次握手中的第三個報文收到后才會知道這個新連接。如果隊列沒有空間,TCP將不理會收到的SYN。如果應(yīng)用層不能及時接受已被

6、TCP接受的連接,這些連接可能占滿整個連接隊列,新的連接請求可能不被響應(yīng)而會超時。如果一個連接請求SYN發(fā)送后,一段時間后沒有收到確認SYN+ACK,TCP會重傳這個連接請求SYN兩次,每次重傳的時間間隔加倍,在規(guī)定的時間內(nèi)仍沒有收到SYN+ACK,TCP將放棄這個連接請求,連接建立就超時了。JAVASocket連接建立超時和TCP是相同的,如果TCP建立連接時三次握手超時,那么導致Socket連接建立也就超時了??梢栽O(shè)置Socket連接建立的超時時間-connect(SocketAddressendpoint,intti

7、meout)如果在timeout內(nèi),連接沒有建立成功,在TimeoutException異常被拋出。如果timeout的值小于三次握手的時間,那么Socket連接永遠也不會建立。不同的應(yīng)用層有不同的連接建立過程,Socket的連接建立和TCP一樣-僅僅需要三次握手就完成連接,但有些應(yīng)用程序需要交互很多信息后才能成功建立連接,比如Telnet協(xié)議,在TCP三次握手完成后,需要進行選項協(xié)商之后,Telnet連接才建立完成。3socket讀超時如果輸入緩沖隊列RecvQ中沒有數(shù)據(jù),read操作會一直阻塞而掛起線程,直到有新的數(shù)據(jù)

8、到來或者有異常產(chǎn)生。調(diào)用setSoTimeout(inttimeout)可以設(shè)置超時時間,如果到了超時時間仍沒有數(shù)據(jù),read會拋出一個SocketTimeoutException,程序需要捕獲這個異常,但是當前的socket連接仍然是有效的。如果對方進程崩潰、對方機器突然重啟、網(wǎng)絡(luò)斷開,本端的read

當前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。