標籤:需要 阻塞 poi 解析 get target 綁定 stat 安全
註:本文來自:簡書:jianshu
jijs
連結:http://www.jianshu.com/p/7c0722a8b66f
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
構造
- public ServerSocket()
構造一個ServerSocket,但不綁定任何連接埠,所以也不能接受任何的請求串連。以後可以通過bing()方法來進行綁定。
- public ServerSocket(int port)
通過一個連接埠來構造一個ServerSocket對象。
預設的tcp隊列大小為50.
預設監聽本地所有的ip地址(如果有多個網卡)。
1 TCP分為全串連隊列和半串連隊列。這裡說的是全串連隊列 2 半串連隊列:第一次握手,伺服器收到用戶端的請求時,該請求串連放到半串連隊列中。 3 全串連隊列:已經通過三向交握後,把當前串連資訊存放到全串連隊列中。全串連隊列中的串連等待ServerSocket.accpt()處理。
- public ServerSocket(int port, int backlog)
通過一個連接埠和TCP隊列大小來構造一個ServerSocket對象。
預設監聽本地所有的ip地址(如果有多個網卡)。
- public ServerSocket(int port, int backlog, InetAddress bindAddr)
通過一個連接埠、TCP隊列大小和一個InetAddress 來構造一個ServerSocket對象。
一個伺服器可能有多個網卡,多個ip地址,通過此構造傳入一個InetAddress ,可以只監聽從此網卡過來的請求串連。
比如:一個電腦上有兩個網卡,一個是外網地址,一個是內網地址。為了安全此ServerSocket只允許監聽內網ip地址的請求,而不接收外網請求。
bind 方法
通過無參構造的ServerSocket對象,需要bing方法進行綁定操作才能處理用戶端的請求。
1 public void bind(SocketAddress endpoint) throws IOException { 2 bind(endpoint, 50); 3 } 4 5 public void bind(SocketAddress endpoint, int backlog) throws IOException { 6 ... 7 }
- 通過SocketAddress 進行綁定,預設TCP隊列大小為50。
- 通過SocketAddress 和 TCP請求隊列大小 兩個參數 進行綁定。
accept 方法
1 public Socket accept()
該方法會從全串連隊列中擷取一個用戶端Socket請求。該方法是阻塞方法。如果當前沒有請求的串連,則會一直阻塞,直到有用戶端串連請求為止。
擷取ServerSocket相關資訊
- public InetAddress getInetAddress()
擷取本地地址,如果本地有多個ip,隨機返回一個。
- public int getLocalPort()
擷取綁定的連接埠。
如果構造ServerSocket中預設連接埠傳入一個0,則是隨機產生一個連接埠,這時就需要使用此方法來擷取連接埠資訊。
- public SocketAddress getLocalSocketAddress()
返回本地地址和連接埠。
通過源碼發現該方法內部擷取本地地址是通過調用getInetAddress()方法進行擷取的。擷取連接埠是通過getLocalPort()方法擷取的。
使用ServerSocket 判斷當前系統已經佔用的連接埠
1 public static void main(String[] args) throws Exception { 2 for(int port=1; port<65535; port++){ 3 try{ 4 ServerSocket s = new ServerSocket(port); 5 }catch(IOException e){ 6 System.out.println("當前系統中已經使用的連接埠:"+port); 7 } 8 } 9 }
運行結果如下:
java.net.ServerSocket 解析