判斷對方是否斷開連線:
一、方法層面的實現:
1,使用輸入流的read方法:
輸入流的read(byte ,int ,int) 方法,表示從當前的通道中讀取資料,具體讀取到的資料有返回的int值決定;這裡的返回值和丟擲的異常很重要,如果丟擲ioexception異常,很明顯連線已經斷開;
返回值說明:
針對於基於tcp/ip協議的socket連線說明:
如果沒有設定socket的sotimeout屬性,那麼該方法將是乙個阻塞方法,可以通過設定socket的sotimeout屬性,讓read方法退出。
注意:read方法如果timeout將以丟擲sockettimeoutexception異常;
客戶端:
如果對方斷開連線,客戶端的read方法將返回-1;
伺服器端:
如果對方斷開連線,伺服器端的read方法將丟擲ioexception異常;
建議使用這種方式,netty底層原始碼就是使用的這種方式實現的;
2,使用socket 的sendurgentdata(int) :
注意:不建議使用此種方式,因為使用該方式有很多不可**的情況;
通常情況是:接收端沒有開啟socket的so_oobinline屬性,那麼使用sendurgentdata(int)測試連線時,在傳送17次(windows測試資料)時會發生異常;而如果接收端開啟socket的so_oobinline屬性,那麼接收端就會收到傳送的資料,從而導致真實資料的混亂;
socket sendurgentdata(int) 17次異常說明;
對於17次傳送異常,在一片文章中有看到,說:如果接收端沒有開啟socket的so_oobinline的屬性(當然這也是想把該方法用於心跳檢測的必須條件),那麼接收端將拋棄接收到的這個資料,也不會向傳送端返回對應的ack值;但是,傳送端卻會占用乙個tcp/ip的傳送視窗,一直等待接收端的返回,這裡肯定等待不到,就會一直占用視窗;而乙個tcp/ip基於平台只有8或16個視窗,於是,在第17次傳送資料時丟擲異常了;
意思,作者是懂的,但真正的底層實現卻不太清楚;提供tcp/ip視窗詳解連線:
二、協議層面的實現:
通過自定義的心跳機制,這也是最常用的方式之一;
示例實現:
定義了乙個抽象的通道處理類,提供遠端斷開連線的判斷;
importj**a.io.ioexception;
import
j**a.io.inputstream;
import
j**a.net.sockettimeoutexception;
/*** 提供基於tcp/ip協議連線的斷開判斷實現
* @author *
*/public
abstract
class
abstractchannelhandler
catch
(sockettimeoutexception e)
catch
(ioexception e)
return
result;
}protected
void
setclosed()
/*** 連線是否關閉
* @return
false 未關閉; true 關閉
*/public
boolean
isclosed()
/*** 向遠端連線傳送心跳資料;
*/protected
void
sendheartbeat() {}
/*** 通過協議層的心跳傳送,判斷遠端連線是否關閉;
* @return
*/protected
boolean
isclosedbysendheartbeat()
/*** 設定socket 輸入流的讀取超時時間,用於設定 方法的timeout時間
* 否則將一直阻塞;
*/abstract
protected
void
setsotimeout();
/*** 返回與該通道相關聯的輸入流;
* @return
*/abstract
protected inputstream inputstream() throws
ioexception;
}
通道處理類,繼承與上述抽象類,方便斷開連線的判斷
importj**a.io.ioexception;
import
j**a.io.inputstream;
import
j**a.net.socket;
import
j**a.net.socketexception;
public
class channelhandler extends
abstractchannelhandler
@override
protected inputstream inputstream() throws
ioexception
return
is; }
@override
protected
void
setsotimeout()
catch
(socketexception e)
}}
demo,親測可用:
staticpublic
void test() throws
ioexception
if(n > 0)
}}
網路通訊之校驗
這是乙個可選的選項,並不是所有的系統都對udp資料報加以檢驗和資料 相對tcp協議的必須來說 但是rfc中標準要求,傳送端應該計算檢驗和。udp檢驗和 覆蓋udp協議頭和資料,這和ip的檢驗和是不同的,ip協議的檢驗和只是覆蓋ip資料頭,並不覆蓋所有的資料。tcp校驗 首部和資料的校驗和 udp校驗...
網路通訊之BIO
bio 同步並阻塞 傳統阻塞型 伺服器實現模式為乙個連線乙個執行緒,即客戶端有連線請求時伺服器端就需要啟動乙個執行緒進行處理,如果這個連線不做任何事情會造成不必要的執行緒開銷.bio常用類 datagrampacket datagramsocket封包 datagramsocket ds new d...
網路通訊之TCP UDP
1 udp乙個socket接收緩衝區的預設值 cat proc sys net core rmem default 212992,單位byte,208kb 3 每個udp socket都有乙個接收緩衝區,沒有傳送緩衝區,從概念上來說就是只要有資料就發,不管對方是否可以正確接收,所以不緩衝,不需要傳送...