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