91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

客戶端Socket與服務端ServerSocket串聯實現網絡通信的方法

發布時間:2022-03-11 09:05:32 來源:億速云 閱讀:166 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“客戶端Socket與服務端ServerSocket串聯實現網絡通信的方法”,內容詳細,步驟清晰,細節處理妥當,希望這篇“客戶端Socket與服務端ServerSocket串聯實現網絡通信的方法”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    1、類屬性

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

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

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

    2、初始化

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

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

    public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException {
        // 默認是 SocksSocketImpl 實現
        setImpl();
        // 端口必須大于 0,小于 65535
        if (port < 0 || port > 0xFFFF)
            throw new IllegalArgumentException(
                       "Port value out of range: " + port);
        // 最大可連接數如果小于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;
        }
    }

    入參 port 指的是 ServerSocket 需要綁定本地那個端口。

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

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

    入參 InetAddress 表示 ip 地址。

    3、bind

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

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

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

    4、accept

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

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

    5、面試題

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

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

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

    答:SocketOptions 類有很多屬性設置,比如 SO_TIMEOUT 、SO_LINGER 等等,這些問題說一下自己的理解即可

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

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

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

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

    • 服務端使用預期的 ACK 回復,說明一切正常;

    • 服務端回復 RST,表示服務端處于死機或者重啟狀態,終止連接;

    • 沒有得到服務端的響應(會嘗試多次),表示套接字已經關閉了。

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

    讀到這里,這篇“客戶端Socket與服務端ServerSocket串聯實現網絡通信的方法”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    永春县| 井陉县| 德保县| 开平市| 屯昌县| 买车| 伊金霍洛旗| 双鸭山市| 文安县| 克拉玛依市| 区。| 蓝山县| 瓦房店市| 蚌埠市| 仁怀市| 华安县| 绿春县| 濉溪县| 敦化市| 齐河县| 盐池县| 文安县| 鹤岗市| 马龙县| 罗城| 沙雅县| 襄樊市| 醴陵市| 泾阳县| 阿拉善左旗| 婺源县| 三都| 保山市| 海林市| 克山县| 新蔡县| 通河县| 瑞丽市| 农安县| 奉节县| 庆云县|