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