<code>Socket</code>類表示一個(gè)<code>客戶端套接字</code>,即,當(dāng)想要連接到遠(yuǎn)程服務(wù)器應(yīng)用程序時(shí)創(chuàng)建的<code>套接字</code>。
想要實(shí)現(xiàn)一個(gè)服務(wù)器應(yīng)用程序(例如一個(gè)HTTP服務(wù)器或FTP服務(wù)器),你需要另一種方法。應(yīng)為服務(wù)器必須時(shí)刻待命,它并不知道客戶端應(yīng)用程序會(huì)在什么時(shí)候發(fā)起連接。此時(shí)需要使用<code>java.net.ServerSocket</code>類,這是<code>服務(wù)器套接字</code>的實(shí)現(xiàn)。
<code>ServerSocket</code>類與<code>Socket</code>類并不相同。<code>服務(wù)器套接字</code>要等待來自客戶端的連接請(qǐng)求。當(dāng)<code>服務(wù)器套接字</code>收到連接請(qǐng)求后,它會(huì)創(chuàng)建一個(gè)<code>Socket</code>實(shí)例來處理與客戶端的通信。
- 創(chuàng)建<code>服務(wù)器套接字</code>即<code>ServerSocket</code>實(shí)例
可以使用<code>ServerSocket</code>類提供的4個(gè)構(gòu)造函數(shù)中的任意一個(gè)。需要指明IP地址和<code>服務(wù)器套接字</code>偵聽的端口號(hào)。
典型的情況下,IP地址可以是127.0.0.1,即<code>服務(wù)器套接字</code>會(huì)偵聽本地機(jī)器接收到的連接請(qǐng)求。
<code>服務(wù)器套接字</code>偵聽的IP地址成為綁定地址。
<code>服務(wù)器套接字</code>的另一個(gè)重要屬性是backLog,表示在服務(wù)器拒絕接收傳入的請(qǐng)求之前,傳入的連接請(qǐng)求的最大隊(duì)列長度。
其中一個(gè)構(gòu)造函數(shù)簽名如下:
<code>public ServerSocket(int port, int backLog, InetAddress bindingAddress);</code>
需要注意,參數(shù)綁定地址必須是<code>java.net.InetAddress</code>類的實(shí)例。
創(chuàng)建<code>InetAddress</code>對(duì)象的一種簡單方法是調(diào)用其靜態(tài)方法getByName(),傳入包含主機(jī)名的字符串,代碼如下:
<code>InetAddress.getByName("127.0.0.1");</code> - 創(chuàng)建了<code>ServerSocket</code>實(shí)例后,可以使其等待傳入的連接請(qǐng)求,該連接請(qǐng)求會(huì)通過<code>服務(wù)器套接字</code>偵聽的端口上綁定地址傳入。
- <code>ServerSocket</code>處理連接請(qǐng)求
處理連接請(qǐng)求通過調(diào)用<code>ServerSocket</code>類的<code>accept()</code>方法完成。
只有當(dāng)接收到連接請(qǐng)求后,該方法才會(huì)返回,其返回值是一個(gè)<code>Socket</code>實(shí)例。
然后,如上節(jié)1.2.1 Socket類 所述,可以使用該<code>Socket</code>對(duì)象與客戶端應(yīng)用程序進(jìn)行字節(jié)流的發(fā)送/接收。