更新時(shí)間:2022-07-29 來源:黑馬程序員 瀏覽量:
在開發(fā)TCP程序時(shí),首先需要?jiǎng)?chuàng)建服務(wù)器端程序。JDK的java.net包中提供了一個(gè)ServerSocket婁,該類的實(shí)例對(duì)象可以實(shí)現(xiàn)一個(gè)服務(wù)器端的程序。通過查閱API文檔可知,ServerSocket類提供了多個(gè)構(gòu)造方法,接下來就對(duì)ServerSocket的構(gòu)造方法進(jìn)行詳細(xì)講解。
(1) ServerSocket()
使用該構(gòu)造方法在創(chuàng)建ServerSocket對(duì)象時(shí)并沒有指定端口號(hào),因此該對(duì)象不監(jiān)聽任何端口,不能直接使用,使用時(shí)還需要調(diào)用bind(SocketAddress
endpoint)方法將其綁定到指定的端口號(hào)上。
(2)ServerSocket(int port)
使用該構(gòu)造方法在創(chuàng)建ServerSocket對(duì)象時(shí),可以將其綁定到指定的端口號(hào)上。如果port參數(shù)值為0,此時(shí)系統(tǒng)就會(huì)分配一個(gè)未被其他程序占用的端口號(hào)。由于客戶端需要根據(jù)指定的端口號(hào)來訪問服務(wù)器端程序,因此端口號(hào)隨機(jī)分配的情況并不常用,通常都會(huì)給服務(wù)器端指定一個(gè)端口號(hào)
(3)ServerSocket(int port,int backlog)
該構(gòu)造方法就是在第2個(gè)構(gòu)造方法的基礎(chǔ)上,增加了一個(gè)backlog參數(shù)。該參數(shù)用于指定在服務(wù)器忙時(shí),可以與之保持連接請(qǐng)求的等待客戶端數(shù)量,如果沒有指定這個(gè)參數(shù),默認(rèn)為50。
(4)ServerSocket(int port, int backlog, InetAddress bindAddr)
該構(gòu)造方法就是在第3個(gè)構(gòu)造方法的基礎(chǔ)上,指定了相關(guān)的IP地址,這種情況適用于計(jì)算機(jī)上有多塊網(wǎng)卡和多個(gè)IP的情況,使用時(shí)可以明確規(guī)定ServerSocket在哪塊網(wǎng)卡或IP地址上等待客戶端的連接請(qǐng)求。顯然,對(duì)于一般只有一塊網(wǎng)卡的情況,就不用專門指定該參數(shù)。
在以上介紹的構(gòu)造方法中,第2個(gè)構(gòu)造方法是最常使用的。了解了如何通過ServerSocket的構(gòu)造方法創(chuàng)建對(duì)象,接下來學(xué)習(xí)ServerSocket的常用方法,如下表所示。
ServerSocket對(duì)象負(fù)責(zé)監(jiān)聽某臺(tái)客戶端計(jì)算機(jī)的端口號(hào),在創(chuàng)建ServerSocket對(duì)象后,需要繼續(xù)調(diào)用該對(duì)象的accept()方法,接收來自客戶端的請(qǐng)求。當(dāng)執(zhí)行了accept()方法之后,服務(wù)器端程序會(huì)發(fā)生阻塞,直到客戶端發(fā)出連接請(qǐng)求,accept()方法才會(huì)返回一個(gè)Scoket對(duì)象用于和客戶端實(shí)現(xiàn)通信,程序才能繼續(xù)向下執(zhí)行。