<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
    復制粘貼搞出來的低級錯誤……已更正,謝謝提醒!
    主站蜘蛛池模板: 一级毛片在线免费播放| 亚洲另类自拍丝袜第五页| 国产日韩精品无码区免费专区国产| 免费特级黄毛片在线成人观看| 亚洲成AV人综合在线观看| 精品无码AV无码免费专区| 亚洲AV无码第一区二区三区 | 亚洲av片劲爆在线观看| 亚洲激情视频在线观看| 久久99免费视频| 精品亚洲综合在线第一区| 两性色午夜视频免费播放| 国产亚洲视频在线播放| AAA日本高清在线播放免费观看| 亚洲精品你懂的在线观看| 久久久久国产精品免费网站| 亚洲电影免费在线观看| av大片在线无码免费| 天堂亚洲国产中文在线| 亚洲AV之男人的天堂| 波霸在线精品视频免费观看| 久久精品国产亚洲综合色| 99爱视频99爱在线观看免费| 亚洲一区中文字幕| 成人免费在线观看网站| 男女啪啪免费体验区| 精品国产亚洲一区二区三区| www视频在线观看免费| 日韩亚洲产在线观看| 亚洲精品无码激情AV| 久久久免费的精品| 亚洲精品无码不卡在线播放| 久久久久久亚洲精品不卡| 99视频精品全部免费观看| 亚洲综合久久精品无码色欲| 亚洲美女高清一区二区三区| 蜜桃视频在线观看免费视频网站WWW| 亚洲一区在线视频观看| 亚洲免费日韩无码系列| 中文字幕免费高清视频| 美女羞羞视频免费网站|