欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

引導語

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

1、類屬性

ServerSocket 的主要作用,是作為服務端的套接字,接受客戶端套接字傳遞過來的信息,并把響應回傳給客戶端,其屬性非常簡單,如下:

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

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

2、初始化

初始化大概可以分成兩類:無參構造器和有參構造器。

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

public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException {
    // 默認是 SocksSocketImpl 實現(xiàn)
    setImpl();
    // 端口必須大于 0,小于 65535
    if (port < 0 || port > 0xFFFF)
        throw new IllegalArgumentException(
                   "Port value out of range: " + port);
    // 最大可連接數(shù)如果小于1,那么采取默認的 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 需要綁定本地那個端口。

入?yún)?backlog 指的是服務端接受客戶端連接隊列的最大長度,這里需要注意的是,這里并不是限制客戶端連接的個數(shù),我們在 JDK8 版本下做過實驗,我們把服務端的 backlog 設置成 1,并且變慢服務端的處理速度,當服務端并發(fā)請求過來時,并不是第二個請求過來就拒絕連接,我們在實際工作中,最好也不要用 backlog 來限制客戶端連接的個數(shù)。

還有點需要注意的是 backlog 小于 1 時,backlog 會被設置成默認的 50。

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

3、bind

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

配合無參構造器,一般我們這么用:

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

4、accept

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

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

5、面試題

5.1、說說你對 Socket 和 ServerSocket 的理解?

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

5.2、說說對 SocketOptions 中的 SO_TIMEOUT 的理解?

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

5.3、在構造 Socket 的時候,我可以選擇 TCP 或 UDP 么?應該如何選擇?

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

5.4、TCP 有自動檢測服務端是否存活的機制么?有沒有更好的辦法?

答:有的,我們可以通過 setKeepAlive 方法來激活該功能,如果兩小時內(nèi),客戶端和服務端的套接字之間沒有任何通信,TCP 會自動發(fā)送 keepalive 探測給服務端,預測服務端有三種情況:

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

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

總結

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

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

相關文章

  • Java面試必問之ThreadLocal終極篇分享

    Java面試必問之ThreadLocal終極篇分享

    ThreadLocal是什么呢?其實ThreadLocal并非是一個線程的本地實現(xiàn)版本,它并不是一個Thread,而是thread local variable(線程局部變量),這篇文章主要給大家介紹了關于Java面試必問之ThreadLocal終極篇的相關資料,需要的朋友可以參考下
    2021-10-10
  • Java實現(xiàn)短信發(fā)送驗證碼功能

    Java實現(xiàn)短信發(fā)送驗證碼功能

    這篇文章主要介紹了Java實現(xiàn)短信發(fā)送驗證碼功能,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2018-10-10
  • 詳解Spring Boot整合Mybatis實現(xiàn) Druid多數(shù)據(jù)源配置

    詳解Spring Boot整合Mybatis實現(xiàn) Druid多數(shù)據(jù)源配置

    本篇文章主要介紹了詳解Spring Boot整合Mybatis實現(xiàn) Druid多數(shù)據(jù)源配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Java抽象類的構造模板模式用法示例

    Java抽象類的構造模板模式用法示例

    這篇文章主要介紹了Java抽象類的構造模板模式用法,結合實例形式分析了java使用抽象類構造模板模式相關操作技巧,需要的朋友可以參考下
    2019-09-09
  • JSONObject與JSONArray的使用

    JSONObject與JSONArray的使用

    這篇文章主要介紹了JSONObject與JSONArray的使用 的相關資料,需要的朋友可以參考下
    2016-06-06
  • Java常見面試題之多線程和高并發(fā)詳解

    Java常見面試題之多線程和高并發(fā)詳解

    這篇文章主要給大家介紹了關于Java面試題之多線程和高并發(fā)的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • java?緩沖流的概念使用方法以及實例詳解

    java?緩沖流的概念使用方法以及實例詳解

    這篇文章主要為大家介紹了java?緩沖流的概念使用方法以及實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 基于java構造方法Vector查找元素源碼分析

    基于java構造方法Vector查找元素源碼分析

    本篇文章是關于ava構造方法Vector源碼分析系列文章,本文主要介紹了Vector查找元素的源碼分析,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • Mybatis-Plus 搭建與使用入門(小結)

    Mybatis-Plus 搭建與使用入門(小結)

    Mybatis-Plus(簡稱MP)是一個 Mybatis 的增強工具,這篇文章主要介紹了Mybatis-Plus 搭建與使用入門(小結),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • MyEclipse 2016 CI 4新增BootStrap模板

    MyEclipse 2016 CI 4新增BootStrap模板

    MyEclipse2016是一款全球使用最為廣泛的企業(yè)級開發(fā)環(huán)境程序,這篇文章主要介紹了MyEclipse 2016 CI 4新增BootStrap模板的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06

最新評論