長鏈接------------------
心跳: socket模擬網(wǎng)頁的報文連接某個網(wǎng)站,創(chuàng)建tcp的socket后,當我socket.connect后,如果在5到7秒鐘不socket.send,那么這個鏈接就失效了。 請問如何長時間的保持這個鏈接 這是在服務(wù)器端的設(shè)置的,客戶端沒法設(shè)置,可以發(fā)送心跳包。 socket.connect后,每3-4秒用socket.send發(fā)送一字節(jié)數(shù)據(jù)(內(nèi)容隨便),然后觀查這個連接是否保持。 lientSocket=serverSocket.accept(); OutputStream os = clientSocket.getOutputStream(); ObjectOutputStream oos=new ObjectOutputStream(os); oos.writeObject(al); oos.flush(); oos.close()//socket會關(guān)閉 實現(xiàn): 長連接的維持,是要客戶端程序,定時向服務(wù)端程序,發(fā)送一個維持連接包的。 如果,長時間未發(fā)送維持連接包,服務(wù)端程序?qū)嚅_連接。 客戶端: 通過持有Client對象,可以隨時(使用sendObject方法)發(fā)送Object給服務(wù)端。 如果keepAliveDelay毫秒(程序中是2秒)內(nèi)未發(fā)送任何數(shù)據(jù),則,自動發(fā)送一個KeepAlive對象給服務(wù)端, 用于維持連接。 由于,我們向服務(wù)端,可以發(fā)送很多不同的對象,服務(wù)端也可以返回不同的對象。 所以,對于返回對象的處理,要編寫具體的ObjectAction實現(xiàn)類進行處理。 通過Client.addActionMap方法進行添加。這樣,程序會回調(diào)處理。 服務(wù)端: 由于客戶端會定時(keepAliveDelay毫秒)發(fā)送維持連接的信息過來,所以,服務(wù)端要有一個檢測機制。 即當服務(wù)端receiveTimeDelay毫秒(程序中是3秒)內(nèi)未接收任何數(shù)據(jù),則,自動斷開與客戶端的連接。
長連接與短連接的操作過程 通常的短連接操作步驟是: 連接→數(shù)據(jù)傳輸→關(guān)閉連接;而長連接通常就是: 連接→數(shù)據(jù)傳輸→保持連接(心跳)→數(shù)據(jù)傳輸→保持連接(心跳)→……→關(guān)閉連接; 這就要求長連接在沒有數(shù)據(jù)通信時,定時發(fā)送數(shù)據(jù)包(心跳),以維持連接狀態(tài),短連接在沒有數(shù)據(jù)傳輸時直接關(guān)閉就行了什么時候用長連接,短連接?長連接多用于操作頻繁,點對點的通訊,而且連接數(shù)不能太多情況。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多,所以每個操作完后都不斷開,下次次處理時直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連接。
方法1:應(yīng)用層自己實現(xiàn)的心跳包 由應(yīng)用程序自己發(fā)送心跳包來檢測連接是否正常,大致的方法是:服務(wù)器在一個 Timer事件中定時 向客戶端發(fā)送一個短小精悍的數(shù)據(jù)包,然后啟動一個低級別的線程,在該線程中不斷檢測客戶端的回應(yīng), 如果在一定時間內(nèi)沒有收到客戶端的回應(yīng),即認為客戶端已經(jīng)掉線;同樣,如果客戶端在一定時間內(nèi)沒 有收到服務(wù)器的心跳包,則認為連接不可用。方法2:TCP的KeepAlive保活機制因為要考慮到一個服務(wù)器通常會連接多個客戶端,因此由用戶在應(yīng)用層自己實現(xiàn)心跳包,代碼較多 且稍顯復(fù)雜,而利用TCP/ip協(xié)議層為內(nèi)置的KeepAlive功能來實現(xiàn)心跳功能則簡單得多。 不論是服務(wù)端還是客戶端,一方開啟KeepAlive功能后,就會自動在規(guī)定時間內(nèi)向?qū)Ψ桨l(fā)送心跳包, 而另一方在收到心跳包后就會自動回復(fù),以告訴對方我仍然在線。 因為開啟KeepAlive功能需要消耗額外的寬帶和流量,所以TCP協(xié)議層默認并不開啟KeepAlive功 能,盡管這微不足道,但在按流量計費的環(huán)境下增加了費用,另一方面,KeepAlive設(shè)置不合理時可能會 因為短暫的網(wǎng)絡(luò)波動而斷開健康的TCP連接。并且,默認的KeepAlive超時需要7,200,000 MilliSeconds, 即2小時,探測次數(shù)為5次。對于很多服務(wù)端應(yīng)用程序來說,2小時的空閑時間太長。因此,我們需要手工開啟KeepAlive功能并設(shè)置合理的KeepAlive參數(shù)。以上轉(zhuǎn)自網(wǎng)絡(luò)。心跳包機制新聞熱點
疑難解答