Socket用法詳解<1>


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地址或端口綁定,就會拋出這種異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM