Socket用法詳解 1

2021-07-03 08:21:17 字數 2761 閱讀 8701

socket的構造方法有以下幾種過載形式:

(1) socket()

(2) socket(inetaddress address,int port)throws unknownhostexception,ioexception

(3) socket(inetaddress address,int port,inetaddress localaddr,int localport)throws ioexception

(4) socket(string host,int port)throws unknownhostexception,ioexception

(5) socket(string host,int port,inetaddress localaddr,int localport)throws ioexception

一、設立等待建立連線的超時時間

當客戶端的socket構造方法請求與伺服器連線時,可能要等待一段時間。預設情況下,socket構造方法會一直等下去,直到連線成功,或者出現異常。socket構造方法請求連線時,受底層網路的傳輸速度的影響,可能會處於長時間的等待狀態。如果希望設定等待連線的時間,該如何做呢?

此時就需要用到第乙個不帶引數的構造方法:

1 socket socket=new

socket();

2 socketaddress remoteaddr=new inetsocketaddress("localhos",8000);

3 socket.connect(remoteaddr,60000);

以上**用於連線到本地機器上的監聽8000埠的服務程式,呆呆連線的最長時間為一分鐘。如果在一分鐘內連線成功,則connect()方法順利返回;如果在一分鐘內出現異常,在丟擲該異常。如果在一分鐘後,既沒有連線成功,也沒有出現其他異常,那麼會丟擲sockettimeoutexception。socket類的connect(socketaddress endpoint,int timeout)方法負責連線伺服器,引數endpoint指定伺服器的位址,引數timeout設定超時時間,以毫秒為時間,吐過引數timeout設為0,表示永遠不會超時。

二、設定伺服器的位址

除了第乙個不帶引數的構造方法,其他構造方法都需要在引數中設定伺服器的位址,包括伺服器的ip位址或主機名,以及埠: 

1 socket(inetaddress address,int port)  //

第乙個引數address表示主機的ip位址;

2 socket(string host,int port)       //

第乙個引數表示主機的名字

inetaddress類表示伺服器的ip位址,inetaddress類來提供了一系列靜態工廠方法,用於構造自身的例項,例如:

//

返回本地主機的ip位址

inetaddress addr1=inetaddress.getlocalhost();

//返回代表"222.34.5.7"的ip位址

inetaddress addr2=inetaddress.getbyname("222.34.5.7");

//返回網域名稱為"www.cnblogs.com"的ip位址

inetaddress addr3=inetaddress.getbyname("www.cnblogs.com");

三、設定客戶端的位址

在乙個socket物件中,既包括遠端伺服器的ip位址和埠資訊,也包含本地客戶端的ip位址和埠資訊。預設情況下,客戶端的ip位址來自客戶程式所在的主機,客戶端的埠則有作業系統隨機分配。socket的類還有兩種構造方法允許顯示的設定客戶端的ip位址和埠:

1

//引數localaddress和localport用來設定客戶端的ip位址和埠。

2 socket(inetaddress address,int port,inetaddress localaddr,int localport)throws

ioexception

3 socket(string host,int port,inetaddress localaddr,intlocalport)throws ioexception

如果乙個主機同時屬於兩個以上的網路,他就可能擁有兩個以上的ip位址。例如,乙個主機在internet網路中的ip位址為「222.67.1.34」,在乙個區域網中的ip為「112.5.4.3」。假設這個主機上的,客戶端程式希望和同乙個區域網上的乙個伺服器程式通訊,客戶可按照如下方式構造socket物件:

1 inetaddress remoteaddr=inetaddress.getbyname("112.5.4.45")

2 inetaddress localaddr=inetaddress.getbyname("112.5.4.3")

3 socketsocket=new socket(remoteaddr,8000,localaddr,2345)//

客戶端使用埠2345

四、客戶連線伺服器是可能跑出的異常

當socket的構造方法請求連線伺服器是,可能會丟擲下面的異常。

*unknownhostexception:如果無法識別主機的名字或者ip位址,就會丟擲這種異常。

*connectexception:如果沒有伺服器程序監聽指定的埠,或者伺服器程序拒絕連線,就會丟擲這種異常。

*socketexception:如果等待連線超時就會丟擲這種異常。

*bindexception:如果無法把socket物件與指定的本機ip位址或埠繫結,就會丟擲這種異常。

socket 函式用法詳解 建立套接字

不管是 windows 還是 linux,都使用 socket 函式來建立套接字。socket 在兩個平台下的引數是相同的,不同的是返回值。在 socket是什麼 一節中我們講到了 windows 和 linux 在對待 socket 方面的區別。linux 中的一切都是檔案,每個檔案都有乙個整數型...

socket 函式用法詳解 建立套接字

不管是 windows 還是 linux,都使用 socket 函式來建立套接字。socket 在兩個平台下的引數是相同的,不同的是返回值。在 socket是什麼 一節中我們講到了 windows 和 linux 在對待 socket 方面的區別。linux 中的一切都是檔案,每個檔案都有乙個整數型...

socket 函式用法詳解 建立套接字

不管是 windows 還是 linux,都使用 socket 函式來建立套接字。socket 在兩個平台下的引數是相同的,不同的是返回值。在 socket是什麼 一節中我們講到了 windows 和 linux 在對待 socket 方面的區別。linux 中的一切都是檔案,每個檔案都有乙個整數型...