java.net.ServerSocket 解析
構(gòu)造
public ServerSocket()
構(gòu)造一個(gè)ServerSocket,但不綁定任何端口,所以也不能接受任何的請(qǐng)求連接。以后可以通過(guò)bing()方法來(lái)進(jìn)行綁定。
public ServerSocket(int port)
通過(guò)一個(gè)端口來(lái)構(gòu)造一個(gè)ServerSocket對(duì)象。
默認(rèn)的tcp隊(duì)列大小為50.
默認(rèn)監(jiān)聽(tīng)本地所有的ip地址(如果有多個(gè)網(wǎng)卡)。
TCP分為全連接隊(duì)列和半連接隊(duì)列。這里說(shuō)的是全連接隊(duì)列
半連接隊(duì)列:第一次握手,服務(wù)器收到客戶端的請(qǐng)求時(shí),該請(qǐng)求連接放到半連接隊(duì)列中。
全連接隊(duì)列:已經(jīng)通過(guò)三次握手后,把當(dāng)前連接信息存放到全連接隊(duì)列中。全連接隊(duì)列中的連接等待ServerSocket.accpt()處理。
public ServerSocket(int port, int backlog)
通過(guò)一個(gè)端口和TCP隊(duì)列大小來(lái)構(gòu)造一個(gè)ServerSocket對(duì)象。
默認(rèn)監(jiān)聽(tīng)本地所有的ip地址(如果有多個(gè)網(wǎng)卡)。
public ServerSocket(int port, int backlog, InetAddress bindAddr)
通過(guò)一個(gè)端口、TCP隊(duì)列大小和一個(gè)InetAddress 來(lái)構(gòu)造一個(gè)ServerSocket對(duì)象。
一個(gè)服務(wù)器可能有多個(gè)網(wǎng)卡,多個(gè)ip地址,通過(guò)此構(gòu)造傳入一個(gè)InetAddress ,可以只監(jiān)聽(tīng)從此網(wǎng)卡過(guò)來(lái)的請(qǐng)求連接。
比如:一個(gè)電腦上有兩個(gè)網(wǎng)卡,一個(gè)是外網(wǎng)地址,一個(gè)是內(nèi)網(wǎng)地址。為了安全此ServerSocket只允許監(jiān)聽(tīng)內(nèi)網(wǎng)ip地址的請(qǐng)求,而不接收外網(wǎng)請(qǐng)求。
bind 方法
通過(guò)無(wú)參構(gòu)造的ServerSocket對(duì)象,需要bing方法進(jìn)行綁定操作才能處理客戶端的請(qǐng)求。
public void bind(SocketAddress endpoint) throws IOException {bind(endpoint, 50); }public void bind(SocketAddress endpoint, int backlog) throws IOException { ... }accept 方法
public Socket accept()該方法會(huì)從全連接隊(duì)列中獲取一個(gè)客戶端Socket請(qǐng)求。該方法是阻塞方法。如果當(dāng)前沒(méi)有請(qǐng)求的連接,則會(huì)一直阻塞,直到有客戶端連接請(qǐng)求為止。
獲取ServerSocket相關(guān)信息
獲取本地地址,如果本地有多個(gè)ip,隨機(jī)返回一個(gè)。
public int getLocalPort()
獲取綁定的端口。
如果構(gòu)造ServerSocket中默認(rèn)端口傳入一個(gè)0,則是隨機(jī)生成一個(gè)端口,這時(shí)就需要使用此方法來(lái)獲取端口信息。
public SocketAddress getLocalSocketAddress()
返回本地地址和端口。
通過(guò)源碼發(fā)現(xiàn)該方法內(nèi)部獲取本地地址是通過(guò)調(diào)用getInetAddress()方法進(jìn)行獲取的。獲取端口是通過(guò)getLocalPort()方法獲取的。
使用ServerSocket 判斷當(dāng)前系統(tǒng)已經(jīng)占用的端口
public static void main(String[] args) throws Exception {for(int port=1; port<65535; port++){try{ServerSocket s = new ServerSocket(port);}catch(IOException e){System.out.println("當(dāng)前系統(tǒng)中已經(jīng)使用的端口:"+port);}} }運(yùn)行結(jié)果如下:
本人簡(jiǎn)書(shū)blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點(diǎn)擊這里快速進(jìn)入簡(jiǎn)書(shū)
GIT地址:http://git.oschina.net/brucekankan/
點(diǎn)擊這里快速進(jìn)入GIT
總結(jié)
以上是生活随笔為你收集整理的java.net.ServerSocket 解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java.net.Socket 解析
- 下一篇: Socket 实现聊天功能