<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 :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理

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

    ServerSocket 實例的初始化

    ServerSocket 類提供了四個構(gòu)造器:

    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

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

    帶參構(gòu)造器

    總的來說,帶參構(gòu)造器提供了三個參數(shù):

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

    默認構(gòu)造器

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

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

    Socket 實例的初始化

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

    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)

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

    連接前的配置

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

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

    評論

    # re: Java 網(wǎng)絡(luò)編程從菜鳥到叫獸 3:套接字初始化詳解  回復(fù)  更多評論   

    2012-02-15 12:57 by Jacklondon Chen
    以下有錯誤:
    ServerSocket 類提供了四個構(gòu)造器:
    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)
    這些構(gòu)造函數(shù)都不是 ServerSocket 的。另外,這里的數(shù)量也不對,明明是六個,怎么變成了四個?
    ----歡迎大家試用我們的單點登錄 http://zheguisoft.com

    # re: Java 網(wǎng)絡(luò)編程從菜鳥到叫獸 3:套接字初始化詳解  回復(fù)  更多評論   

    2012-02-16 15:34 by 蜀山兆孨龘
    @Jacklondon Chen
    復(fù)制粘貼搞出來的低級錯誤……已更正,謝謝提醒!
    主站蜘蛛池模板: yy6080亚洲一级理论| 成人毛片18女人毛片免费96| 国产免费av片在线播放| 91在线亚洲综合在线| 丁香花在线观看免费观看| 亚洲日韩国产精品无码av| 麻豆最新国产剧情AV原创免费 | 亚洲色欲色欲www在线播放 | 18女人腿打开无遮掩免费| 精品日韩亚洲AV无码| 亚洲高清中文字幕免费| 色偷偷女男人的天堂亚洲网| 成人免费视频软件网站| 久久亚洲精品11p| 亚洲精品国精品久久99热| 91免费福利视频| 亚洲国产高清在线| 可以免费看的卡一卡二| 亚洲爆乳成av人在线视菜奈实| 免费人成视频x8x8入口| 中文在线免费看视频| 亚洲精品不卡视频| 免费视频淫片aa毛片| fc2免费人成在线| 久久精品国产亚洲精品2020| 成年人在线免费看视频| 五月天婷婷精品免费视频| 欧洲亚洲国产清在高| 97在线观免费视频观看| 国产成人亚洲精品蜜芽影院| 久久精品国产亚洲综合色| 免费可以在线看A∨网站| 成人免费视频一区二区| 久久亚洲AV午夜福利精品一区 | 日韩精品电影一区亚洲| 国产精品免费福利久久| 亚洲熟女精品中文字幕| 亚洲中文字幕日产乱码高清app| 麻豆国产精品免费视频| h视频免费高清在线观看| 国产99在线|亚洲|