最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

客戶端Socket與服務(wù)端ServerSocket串聯(lián)實(shí)現(xiàn)網(wǎng)絡(luò)通信

 更新時(shí)間:2022年03月10日 16:38:18   作者:Q.E.D.  
這篇文章主要為大家介紹了客戶端Socket與服務(wù)端ServerSocket串聯(lián)實(shí)現(xiàn)網(wǎng)絡(luò)通信的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助

引導(dǎo)語(yǔ)

上一小節(jié)我們學(xué)習(xí)了 Socket,本文我們來(lái)看看服務(wù)端套接字 API:ServerSocket,本文學(xué)習(xí)完畢之后,我們就可以把客戶端 Socket 和服務(wù)端 ServerSocket 串聯(lián)起來(lái),做一個(gè)真實(shí)的網(wǎng)絡(luò)通信的 demo 了。

1、類屬性

ServerSocket 的主要作用,是作為服務(wù)端的套接字,接受客戶端套接字傳遞過(guò)來(lái)的信息,并把響應(yīng)回傳給客戶端,其屬性非常簡(jiǎn)單,如下:

private boolean created = false;// 已創(chuàng)建
private boolean bound = false;// 綁定
private boolean closed = false;// 已關(guān)閉
// 底層的功能都依靠 SocketImpl 來(lái)實(shí)現(xiàn)
private SocketImpl impl;

ServerSocket 和 Socket 一樣,底層都是依靠 SocketImpl 的能力,而 SocketImpl 底層能力的實(shí)現(xiàn)基本上都是 native 方法實(shí)現(xiàn)的。

2、初始化

初始化大概可以分成兩類:無(wú)參構(gòu)造器和有參構(gòu)造器。

無(wú)參構(gòu)造器做的事情比較簡(jiǎn)單,只指定了 SocketImpl 為 SocksSocketImpl 類;有參構(gòu)造器有幾種初始化的形式,我們一起來(lái)看一下參數(shù)最多的構(gòu)造器的源碼。

public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException {
    // 默認(rèn)是 SocksSocketImpl 實(shí)現(xiàn)
    setImpl();
    // 端口必須大于 0,小于 65535
    if (port < 0 || port > 0xFFFF)
        throw new IllegalArgumentException(
                   "Port value out of range: " + port);
    // 最大可連接數(shù)如果小于1,那么采取默認(rèn)的 50
    if (backlog < 1)
      backlog = 50;
    try {
        // 底層 navtive 方法
        bind(new InetSocketAddress(bindAddr, port), backlog);
    } catch(SecurityException e) {
        close();
        throw e;
    } catch(IOException e) {
        close();
        throw e;
    }
}

入?yún)?port 指的是 ServerSocket 需要綁定本地那個(gè)端口。

入?yún)?backlog 指的是服務(wù)端接受客戶端連接隊(duì)列的最大長(zhǎng)度,這里需要注意的是,這里并不是限制客戶端連接的個(gè)數(shù),我們?cè)?JDK8 版本下做過(guò)實(shí)驗(yàn),我們把服務(wù)端的 backlog 設(shè)置成 1,并且變慢服務(wù)端的處理速度,當(dāng)服務(wù)端并發(fā)請(qǐng)求過(guò)來(lái)時(shí),并不是第二個(gè)請(qǐng)求過(guò)來(lái)就拒絕連接,我們?cè)趯?shí)際工作中,最好也不要用 backlog 來(lái)限制客戶端連接的個(gè)數(shù)。

還有點(diǎn)需要注意的是 backlog 小于 1 時(shí),backlog 會(huì)被設(shè)置成默認(rèn)的 50。

入?yún)?InetAddress 表示 ip 地址。

3、bind

bind 方法主要作用是把 ServerSocket 綁定到本地的端口上,只有當(dāng)我們使用無(wú)參構(gòu)造器初始化 ServerSocket 時(shí),才會(huì)用到這個(gè)方法,如果使用有參構(gòu)造器的話,在初始化時(shí)就已經(jīng)綁定到本地的端口上了。

配合無(wú)參構(gòu)造器,一般我們這么用:

// 進(jìn)行初始化
ServerSocket serverSocket = new ServerSocket();
// 進(jìn)行綁定
serverSocket.bind(new InetSocketAddress("localhost", 7007));

4、accept

accept 方法主要是用來(lái) ServerSocket 接受來(lái)自客戶端的套接字的,如果此時(shí)沒(méi)有來(lái)自客戶端的請(qǐng)求時(shí),該方法就會(huì)一直阻塞,如果有通過(guò) setSoTimeout 方法設(shè)置超時(shí)時(shí)間,那么 accept 只會(huì)在超時(shí)間內(nèi)阻塞,過(guò)了超時(shí)時(shí)間就會(huì)拋出異常。

bind 和 accept 方法底層都是 native 方法實(shí)現(xiàn),我們就不看源碼了。

5、面試題

5.1、說(shuō)說(shuō)你對(duì) Socket 和 ServerSocket 的理解?

答:兩者我們都可以稱為套接字,底層基于 TCP/UDP 協(xié)議,套接字對(duì)底層協(xié)議進(jìn)行了封裝,讓我們使用時(shí)更加方便,Socket 常被使用在客戶端,用于向服務(wù)端請(qǐng)求數(shù)據(jù)和接受響應(yīng),ServerSocket 常用于在服務(wù)端,用于接受客戶端的請(qǐng)求并進(jìn)行處理,兩者其底層使用都是依靠 SocketImpl 的子類的 native 方法。

5.2、說(shuō)說(shuō)對(duì) SocketOptions 中的 SO_TIMEOUT 的理解?

答:SocketOptions 類有很多屬性設(shè)置,比如 SO_TIMEOUT 、SO_LINGER 等等,這些問(wèn)題說(shuō)一下自己的理解即可,可以參考 《Socket 源碼及面試題》 中對(duì)各種屬性的解析。

5.3、在構(gòu)造 Socket 的時(shí)候,我可以選擇 TCP 或 UDP 么?應(yīng)該如何選擇?

答:可以的,Socket 有三個(gè)參數(shù)的構(gòu)造器,第三個(gè)參數(shù)表示你想使用 TCP 還是 UDP。

5.4、TCP 有自動(dòng)檢測(cè)服務(wù)端是否存活的機(jī)制么?有沒(méi)有更好的辦法?

答:有的,我們可以通過(guò) setKeepAlive 方法來(lái)激活該功能,如果兩小時(shí)內(nèi),客戶端和服務(wù)端的套接字之間沒(méi)有任何通信,TCP 會(huì)自動(dòng)發(fā)送 keepalive 探測(cè)給服務(wù)端,預(yù)測(cè)服務(wù)端有三種情況:

  • 服務(wù)端使用預(yù)期的 ACK 回復(fù),說(shuō)明一切正常;
  • 服務(wù)端回復(fù) RST,表示服務(wù)端處于死機(jī)或者重啟狀態(tài),終止連接;
  • 沒(méi)有得到服務(wù)端的響應(yīng)(會(huì)嘗試多次),表示套接字已經(jīng)關(guān)閉了。

但我們并不建議使用這種方式,我們可以自己起一個(gè)定時(shí)任務(wù),定時(shí)的訪問(wèn)服務(wù)端的特殊接口,如果服務(wù)端返回的數(shù)據(jù)和預(yù)期一致,說(shuō)明服務(wù)端是存活的。

總結(jié)

Socket 和 ServerSocket 在源碼方面沒(méi)啥特別可說(shuō)的地方,基本都是一些設(shè)置,底層實(shí)現(xiàn)都是 native 的方法,但面試官會(huì)從此延伸到一些網(wǎng)絡(luò)協(xié)議方面的知識(shí),因?yàn)檫@已經(jīng)超出本專欄的范疇了,感興趣的同學(xué)可以自行百度。

以上就是客戶端Socket與服務(wù)端ServerSocket串聯(lián)實(shí)現(xiàn)網(wǎng)絡(luò)通信的詳細(xì)內(nèi)容,更多關(guān)于Socket與ServerSocket串聯(lián)實(shí)現(xiàn)網(wǎng)絡(luò)通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring Native項(xiàng)目實(shí)戰(zhàn)(體驗(yàn)79毫秒啟動(dòng)springboot應(yīng)用)

    Spring Native項(xiàng)目實(shí)戰(zhàn)(體驗(yàn)79毫秒啟動(dòng)springboot應(yīng)用)

    Spring Native是Spring提供的、制作native image的技術(shù)方案,本篇主要內(nèi)容是開(kāi)發(fā)springboot應(yīng)用再構(gòu)建為native image的方法,通過(guò)Spring Native項(xiàng)目實(shí)戰(zhàn)讓大家體驗(yàn)79毫秒啟動(dòng)springboot應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • SpringBoot使用@ResponseBody返回圖片的實(shí)現(xiàn)

    SpringBoot使用@ResponseBody返回圖片的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot使用@ResponseBody返回圖片的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 梳理總結(jié)Java?static關(guān)鍵字的方法作用

    梳理總結(jié)Java?static關(guān)鍵字的方法作用

    這篇文章主要介紹了梳理總結(jié)Java?static關(guān)鍵字的方法作用,?static?關(guān)鍵字可以用來(lái)修飾的成員變量和成員方法,被修飾的成員是屬于類的,而不是單單是屬于某個(gè)對(duì)象的
    2022-06-06
  • Mybatis?Mapper中多參數(shù)方法不使用@param注解報(bào)錯(cuò)的解決

    Mybatis?Mapper中多參數(shù)方法不使用@param注解報(bào)錯(cuò)的解決

    這篇文章主要介紹了Mybatis?Mapper中多參數(shù)方法不使用@param注解報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Java數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹(shù)詳解

    Java數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹(shù)詳解

    二叉搜索樹(shù)作為一個(gè)經(jīng)典的數(shù)據(jù)結(jié)構(gòu),具有鏈表的快速插入與刪除的特點(diǎn),同時(shí)查詢效率也很優(yōu)秀,所以應(yīng)用十分廣泛。本文將詳細(xì)講講二叉搜索樹(shù)的原理與實(shí)現(xiàn),需要的可以參考一下
    2022-06-06
  • 解決Error:(5, 28) java: 程序包org.apache.ibatis.io不存在問(wèn)題

    解決Error:(5, 28) java: 程序包org.apache.ibatis.io

    這篇文章主要介紹了解決Error:(5, 28) java: 程序包org.apache.ibatis.io不存在問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • JAVA8如何妙用Optional解決NPE問(wèn)題詳解

    JAVA8如何妙用Optional解決NPE問(wèn)題詳解

    在Java中,null代表一個(gè)不存在的對(duì)象,如果對(duì)它進(jìn)行操作就會(huì)拋出java.lang.NullPointerException異常,下面這篇文章主要給大家介紹了關(guān)于JAVA8如何妙用Optional解決NPE問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2018-06-06
  • Java中File的實(shí)例詳解

    Java中File的實(shí)例詳解

    這篇文章主要介紹了Java中File的實(shí)例詳解的相關(guān)資料,File代表文件或者目錄的類,這里對(duì)使用方法進(jìn)行詳細(xì)介紹,需要的朋友可以參考下
    2017-08-08
  • Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理(總結(jié))

    Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理(總結(jié))

    這篇文章主要介紹了Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-05-05
  • 一文教你如何判斷Java代碼中異步操作是否完成

    一文教你如何判斷Java代碼中異步操作是否完成

    在許多應(yīng)用程序中,我們經(jīng)常使用異步操作來(lái)提高性能和響應(yīng)度,這篇文章主要介紹了幾種常見(jiàn)的方法來(lái)判斷Java代碼中異步操作是否完成,希望對(duì)大家有所幫助
    2024-02-02

最新評(píng)論

炉霍县| 股票| 巫溪县| 凌云县| 四川省| 清涧县| 仪陇县| 深泽县| 田林县| 霍邱县| 韶关市| 鞍山市| 昌邑市| 鹤庆县| 宁远县| 峨边| 云浮市| 青冈县| 化州市| 双城市| 岐山县| 清徐县| 雷州市| 防城港市| 崇阳县| 江阴市| 长春市| 澄城县| 宕昌县| 芮城县| 高陵县| 隆林| 自贡市| 兴文县| 区。| 茌平县| 金昌市| 神木县| 喜德县| 安平县| 澄城县|