在兩個通信實體沒有建立虛擬鏈路之前,必須有一個通信實體先做出“主動姿態”,主動接受來自其他通信實體的連接請求。
Java中能接受其它通信實體連接請求的類是ServerSocket,ServerSocket對象用於監聽來自客戶端的Socket連接,如果沒有連接,它將一直處於等待狀態。ServerSocket包含一個監聽來自客戶端連接請求的方法。
Socket accept():如果接收到一個客戶端Socket的連接請求,該方法將返回一個與連接客戶端Socket對應的Socket(每個TCP連接有兩個Socket);否則該方法將一直處於等待狀態,線程也被阻塞。
為了創建ServerSocket對象,ServerSocket類提供了如下幾個構造器:
ServerSocket(int port):用指定的端口port來創建一個ServerSocket。該端口應該是有一個有效的端口整數值:0~65535.
ServerSocket(int port , int backlog):增加一個用來改變連接隊列長度的參數backlog。
ServerSocket(int port , int backlog, lnetAddress localAddr):在機器存在多個IP地址的情況下,允許通過localAddr這個參數來指定將ServerSocket綁定到指定的IP地址。
當ServerSocket使用完畢后,應使用ServerSocket的close()方法來關閉該ServerSocket。通常情況下,服務器不應該只接受一個客戶端請求,而應該不斷地接收來自客戶端的所有請求,所以Java程序通常會通過循環不斷地調用ServerSocket的accept()方法。如以下代碼片段所示:
//創建一個ServerSocket對象,用於監聽客戶端Socket的連接請求
ServerSocket ss = new ServerSocket(30000);
//采用循環不斷調用來自客戶端的請求
while(true){
//每當接收到客戶端Socket的請求,服務端也對應產生一個Socket
Socket s = ss.accept();
//下面就可以使用Socket進行通信了
......
}
上面的程序中創建ServerSocket沒有指定IP地址,則該ServerSocket將會綁定到本機默認的IP地址,程序中使用30000作為該ServerSocket的端口號,通常推薦使用1024以上的端口號,主要是為了避免與其應用程序的通用端口沖突。
由於手機無線上網的IP地址通常都是由移動運營公司動態分配的,一般不會有自己固定的IP地址,因此很少在手機上運行服務器端,服務器端通常運行在有固定IP的服務器上。
