日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java.net.ServerSocket 解析

發布時間:2024/9/30 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java.net.ServerSocket 解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

構造

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

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

  • TCP分為全連接隊列和半連接隊列。這里說的是全連接隊列
    半連接隊列:第一次握手,服務器收到客戶端的請求時,該請求連接放到半連接隊列中。
    全連接隊列:已經通過三次握手后,把當前連接信息存放到全連接隊列中。全連接隊列中的連接等待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方法進行綁定操作才能處理客戶端的請求。

    public void bind(SocketAddress endpoint) throws IOException {bind(endpoint, 50); }public void bind(SocketAddress endpoint, int backlog) throws IOException { ... }
  • 通過SocketAddress 進行綁定,默認TCP隊列大小為50。
  • 通過SocketAddress 和 TCP請求隊列大小 兩個參數 進行綁定。
  • accept 方法

    public Socket accept()

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

    獲取ServerSocket相關信息

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

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

  • public SocketAddress getLocalSocketAddress()
    返回本地地址和端口。

  • 通過源碼發現該方法內部獲取本地地址是通過調用getInetAddress()方法進行獲取的。獲取端口是通過getLocalPort()方法獲取的。

    使用ServerSocket 判斷當前系統已經占用的端口

    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("當前系統中已經使用的端口:"+port);}} }

    運行結果如下:

    本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
    點擊這里快速進入簡書

    GIT地址:http://git.oschina.net/brucekankan/
    點擊這里快速進入GIT

    總結

    以上是生活随笔為你收集整理的java.net.ServerSocket 解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。