<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    神奇好望角 The Magical Cape of Good Hope

    庸人不必自擾,智者何需千慮?
    posts - 26, comments - 50, trackbacks - 0, articles - 11
      BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

    ServerSocket 類和 Socket 類都提供了多個公共構造方法。不同的構造方法不僅帶的參數不同,所具有的意義也不一樣。下面分別解析這兩個類的實例初始化過程。

    ServerSocket 實例的初始化

    ServerSocket 類提供了四個構造器:

    public ServerSocket(int port) throws IOException
    public ServerSocket(int port, int backlog) throws IOException
    public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException
    public ServerSocket() throws IOException

    帶參構造器用來創建已綁定的服務器套接字,也就是說構造成功后它就已經開始偵聽指定的端口,且能夠調用 accept() 方法來接受客戶端連接。默認構造器則會創建未綁定的服務器套接字,構造成功后必須手動將其綁定到一個本地地址才能用,在綁定之前可以進行一些選項配置。

    帶參構造器

    總的來說,帶參構造器提供了三個參數:

    port
    指定該服務器套接字所要偵聽的本地端口。如果為 0,則由系統自動分配一個端口號,這必須以另外的方式讓客戶端獲取端口號。
    backlog
    這個名詞目前還沒有合適的譯名。底層系統的 TCP 實現會維護一個連接隊列,該隊列緩存了已被 TCP 處理完畢,但還沒有被服務器套接字接受的客戶端連接。一旦某個連接被接受(通過調用 accept() 方法),它就會被從隊列中移除。backlog 參數就用于指定隊列的最大長度,默認值為 50,但這個值只是一個建議,底層系統可能根據需要自動調整。如果隊列滿了,則其行為是平臺相關的:微軟的 WINSOCK 會拒絕新的連接,其他實現則什么都不做。嚴格地說,微軟沒有遵守規范,破壞了游戲規則……
    bindAddr
    一臺機器可能會有多個本地 IP 地址,例如同時使用多塊網卡。使用其他兩個帶參構造器時,該參數為 null,服務器套接字會在所有的本地 IP 地址(0.0.0.0::0)上偵聽。如果希望只偵聽一個地址,則可使用該參數。

    默認構造器

    如果使用默認構造器,在綁定地址前,還可以做些配置。綁定操作由兩個 bind 方法定義,參數類似于帶參構造器。配置項包括以下方面(都必須在綁定前配置):

    設置是否重用本地地址
    該選項由 setReuseAddress(boolean on) 方法配置,對應底層系統的 SO_REUSEADDR 套接字選項。JDK 沒有定義該選項的默認值。如果該選項為 false,則在關閉 TCP 連接時,為了保證可靠性,該連接可能在關閉后的一段時間(大約兩分鐘)內保持超時狀態(通常稱為 TIME_WAIT 狀態或 2MSL 等待狀態),這段時間里無法將新建的服務器套接字綁定到同一個地址。在開發階段,服務器可能不斷重啟,打開改選項會非常有用。
    設置接收緩沖區大小
    該選項由 setReceiveBufferSize(int size) 方法配置,對應底層系統的 SO_RCVBUF 套接字選項,單位是字節。《RFC 1323 - TCP Extensions for High Performance》將緩沖區大小定義為 64KB。該選項只是一個建議值,底層系統可能根據需要自行調整。
    設置超時值
    該選項由 setSoTimeout(int timeout) 方法配置,對應底層系統的 SO_TIMEOUT 套接字選項,單位是毫秒。默認值為 0。該選項影響 accept 方法的阻塞時間長度,如果超時將引發 SocketTimeoutException。如果設為 0,則表示永不超時。
    設置性能首選項
    性能首選項包括連接時間、延遲和帶寬三個選項,由 setPerformancePreferences(int connectionTime, int latency, int bandwidth) 方法配置。這三個數值分別表示短連接時間、低延遲和高帶寬的相對重要性,數值越大則越重要;其各自的絕對值沒有意義。該方法的初衷是為了讓 Java 能在用非 TCP/IP 實現的套接字環境下工作得更好,某些需要對網絡進行調優的程序也可以將這三個首選項作為配置參數提供給用戶。

    Socket 實例的初始化

    Socket 類提供了六個公共構造器(已過時的除外):

    public Socket(String host, int port) throws UnknownHostException, IOException
    public Socket(InetAddress address, int port) throws IOException
    public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
    public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException
    public Socket()
    public Socket(Proxy proxy)

    前四個構造器創建已連接的客戶端套接字,也就是說構造的時候就會去連接服務器。前兩個構造器需要提供服務器的地址和端口作為參數,本地地址和端口由系統自動分配;后兩個允許手動指定本地地址和端口,但極少使用。后兩個構造器創建未連接的套接字,創建后需要調用 connect 方法手動連接,連接之前可以做一些配置。最后一個構造器接受一個代表代理服務其的 Proxy 對象,JDK 支持 HTTP 和 SOCKS(V4 或 V5)兩種代理類型。

    連接前的配置

    在連接前,客戶端套接字不僅像服務器套接字那樣可以設置是否重用本地地址、緩沖區大小、超時值和性能首選項,還能夠配置以下各項(都必須在連接前配置):

    設置是否保持活躍
    該選項由 setKeepAlive(boolean on) 方法配置,對應底層系統的 SO_KEEPALIVE 套接字選項。默認值為 false。如果打開該選項,則套接字會定期自動發送保持活躍的探測性消息,類似于心跳檢測。根據《RFC 1122 - Requirements for Internet Hosts》的規定,保持活躍機制只是 TCP 的一個可選功能,如果支持的話,默認必須為 false,而且這種機制默認在成功建立連接后,且連續兩小時沒有數據傳輸的情況下才會被激活。從另一方面來看,通過套接字的 I/O 操作完全可以知道連接是否還有效,所以該選項的實用價值不大。
    設置是否收發帶外數據
    該選項由 setOOBInline(boolean on) 方法配置,對應底層系統的 SO_OOBINLINE 套接字選項。默認值為 off。帶外數據(Out-of-band Data)也叫做緊急數據,表示數據很重要,需要使用不同于發送普通數據的一個專用通道來發送。打開該選項后,就可以調用 sendUrgentData(int data) 方法發送一個字節的緊急數據。JDK 對帶外數據只提供了有限支持,緊急數據將會和普通數據一起被收到,并且無法自動區分。該選項對應用開發人員意義不大。
    設置是否從容關閉連接
    該選項由 setSoLinger(boolean on, int linger) 方法配置,對應底層系統的 SO_LINGER 套接字選項。默認為 false。該選項只會影響套接字的關閉,其中的 linger 參數表示超時時間,單位為秒。如果打開改選項:如果將 linger 設為 0,則關閉套接字的時候,未發送的數據會被丟棄,且另一端會出現連接被同位體重置的異常;如果 linger 非 0,則關閉套接字的線程將被阻塞,直到數據全部發送或超時,超時后的行為與底層系統相關,JDK 無法控制。如果關閉該選項,則套接字正常關閉,數據也會全部發送。由于底層實現的差異性,不提倡應用開發人員打開該選項。
    設置是否延遲發送數據
    該選項由 setTcpNoDelay(boolean on) 方法配置,對應底層系統的 TCP_NODELAY TCP 選項。默認值為 off。打開該選項將禁用 Nagle 算法,TCP 包會立即發送;關閉該選項則會啟用 Nagle 算法,多個較小的 TCP 包會被組合成一個大包一起發送,雖然發送延遲了,但有利于避免網絡擁塞。默認為 false。該選項對實時性很強的程序可能有用,但一般的程序不需要關心。
    設置流量類別
    該選項由 setTrafficClass(int tc) 方法配置,對應底層系統的“流量類別”套接字屬性。該選項用于向網絡(例如路由器)提示從該套接字發送的包需要獲取哪些服務類型,對本地 TCP 協議棧沒有影響。IPv4 和 IPv6 分別定義了多個不同的值,例如 IPv4 將 0x08 定義為最大吞吐量,0x10 定義為最小延遲,等等。可以用或運算將多個值合并為一個選項。該選項用來調整性能,需要根據實際情況設置。由于只是建議值,可能被網絡忽略。

    評論

    # re: Java 網絡編程從菜鳥到叫獸 3:套接字初始化詳解  回復  更多評論   

    2012-02-15 12:57 by Jacklondon Chen
    以下有錯誤:
    ServerSocket 類提供了四個構造器:
    public Socket(String host, int port) throws UnknownHostException, IOException
    public Socket(InetAddress address, int port) throws IOException
    public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
    public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException
    public Socket()
    public Socket(Proxy proxy)
    這些構造函數都不是 ServerSocket 的。另外,這里的數量也不對,明明是六個,怎么變成了四個?
    ----歡迎大家試用我們的單點登錄 http://zheguisoft.com

    # re: Java 網絡編程從菜鳥到叫獸 3:套接字初始化詳解  回復  更多評論   

    2012-02-16 15:34 by 蜀山兆孨龘
    @Jacklondon Chen
    復制粘貼搞出來的低級錯誤……已更正,謝謝提醒!
    主站蜘蛛池模板: 久久99精品视免费看| 国产精品免费视频观看拍拍| 182tv免费视视频线路一二三 | 高清永久免费观看| 免费在线观看黄网站| 成人精品国产亚洲欧洲| 亚洲国产精品一区二区第一页免 | 免费a级毛片无码a∨免费软件| 久久亚洲精品无码观看不卡| 中文在线免费看视频| 国产A在亚洲线播放| 99热在线日韩精品免费| 水蜜桃亚洲一二三四在线| 2020因为爱你带字幕免费观看全集| 亚洲国产视频一区| 好吊妞在线新免费视频| 美女视频黄a视频全免费网站一区| 国产亚洲精品a在线观看 | 亚洲αⅴ无码乱码在线观看性色| 国产麻豆免费观看91| 又长又大又粗又硬3p免费视频| 亚洲中文字幕无码永久在线| 四虎国产成人永久精品免费| 亚洲视频一区二区三区四区| 啦啦啦手机完整免费高清观看| 一区二区三区免费在线视频 | 亚洲视频在线免费观看| 亚洲日本乱码卡2卡3卡新区| 免费在线观看理论片| 久久国产精品免费视频| 亚洲日本中文字幕天天更新| 国产亚洲日韩一区二区三区| 色播精品免费小视频| 男人j进女人p免费视频| 亚洲一区二区在线视频| 国产大片免费观看中文字幕| A国产一区二区免费入口| 色噜噜亚洲男人的天堂| 中文字幕亚洲天堂| A级毛片内射免费视频| 中文字幕在线观看免费|