1. 程式人生 > >java.net.ServerSocket 解析

java.net.ServerSocket 解析

etl wid 通過 log 隨機生成 隊列 bin endpoint text

註:本文來自:簡書:jianshu

作者:jijs
鏈接:http://www.jianshu.com/p/7c0722a8b66f
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

構造

  1. public ServerSocket()


    構造一個ServerSocket,但不綁定任何端口,所以也不能接受任何的請求連接。以後可以通過bing()方法來進行綁定。

  2. public ServerSocket(int port)


    通過一個端口來構造一個ServerSocket對象。
    默認的tcp隊列大小為50.
    默認監聽本地所有的ip地址(如果有多個網卡)。

  1 TCP分為全連接隊列和半連接隊列。這裏說的是全連接隊列
  2 半連接隊列:第一次握手,服務器收到客戶端的請求時,該請求連接放到半連接隊列中。
  3 全連接隊列:已經通過三次握手後,把當前連接信息存放到全連接隊列中。全連接隊列中的連接等待ServerSocket.accpt()處理。
  1. public ServerSocket(int port, int backlog)


    通過一個端口和TCP隊列大小來構造一個ServerSocket對象。
    默認監聽本地所有的ip地址(如果有多個網卡)。

  2. 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 }
  1. 通過SocketAddress 進行綁定,默認TCP隊列大小為50。
  2. 通過SocketAddress 和 TCP請求隊列大小 兩個參數 進行綁定。

accept 方法

  1 public Socket accept()

該方法會從全連接隊列中獲取一個客戶端Socket請求。該方法是阻塞方法。如果當前沒有請求的連接,則會一直阻塞,直到有客戶端連接請求為止。

獲取ServerSocket相關信息

  1. public InetAddress getInetAddress()


    獲取本地地址,如果本地有多個ip,隨機返回一個。
  2. public int getLocalPort()
    獲取綁定的端口。

如果構造ServerSocket中默認端口傳入一個0,則是隨機生成一個端口,這時就需要使用此方法來獲取端口信息。

  1. 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 解析