網路通訊之檢測遠端連線是否斷開連線

2022-09-14 00:27:20 字數 3002 閱讀 5044

判斷對方是否斷開連線:

一、方法層面的實現:

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視窗詳解連線:

二、協議層面的實現:

通過自定義的心跳機制,這也是最常用的方式之一;

示例實現:

定義了乙個抽象的通道處理類,提供遠端斷開連線的判斷;

import

j**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;

}

通道處理類,繼承與上述抽象類,方便斷開連線的判斷

import

j**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,親測可用:

static

public

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都有乙個接收緩衝區,沒有傳送緩衝區,從概念上來說就是只要有資料就發,不管對方是否可以正確接收,所以不緩衝,不需要傳送...