您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“客戶端Socket與服務(wù)端ServerSocket串聯(lián)實現(xiàn)網(wǎng)絡(luò)通信的方法”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“客戶端Socket與服務(wù)端ServerSocket串聯(lián)實現(xiàn)網(wǎng)絡(luò)通信的方法”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
ServerSocket 的主要作用,是作為服務(wù)端的套接字,接受客戶端套接字傳遞過來的信息,并把響應(yīng)回傳給客戶端,其屬性非常簡單,如下:
private boolean created = false;// 已創(chuàng)建 private boolean bound = false;// 綁定 private boolean closed = false;// 已關(guān)閉 // 底層的功能都依靠 SocketImpl 來實現(xiàn) private SocketImpl impl;
ServerSocket 和 Socket 一樣,底層都是依靠 SocketImpl 的能力,而 SocketImpl 底層能力的實現(xiàn)基本上都是 native 方法實現(xiàn)的。
初始化大概可以分成兩類:無參構(gòu)造器和有參構(gòu)造器。
無參構(gòu)造器做的事情比較簡單,只指定了 SocketImpl 為 SocksSocketImpl 類;有參構(gòu)造器有幾種初始化的形式,我們一起來看一下參數(shù)最多的構(gòu)造器的源碼。
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 指的是服務(wù)端接受客戶端連接隊列的最大長度,這里需要注意的是,這里并不是限制客戶端連接的個數(shù),我們在 JDK8 版本下做過實驗,我們把服務(wù)端的 backlog 設(shè)置成 1,并且變慢服務(wù)端的處理速度,當服務(wù)端并發(fā)請求過來時,并不是第二個請求過來就拒絕連接,我們在實際工作中,最好也不要用 backlog 來限制客戶端連接的個數(shù)。
還有點需要注意的是 backlog 小于 1 時,backlog 會被設(shè)置成默認的 50。
入?yún)?InetAddress 表示 ip 地址。
bind 方法主要作用是把 ServerSocket 綁定到本地的端口上,只有當我們使用無參構(gòu)造器初始化 ServerSocket 時,才會用到這個方法,如果使用有參構(gòu)造器的話,在初始化時就已經(jīng)綁定到本地的端口上了。
配合無參構(gòu)造器,一般我們這么用:
// 進行初始化 ServerSocket serverSocket = new ServerSocket(); // 進行綁定 serverSocket.bind(new InetSocketAddress("localhost", 7007));
accept 方法主要是用來 ServerSocket 接受來自客戶端的套接字的,如果此時沒有來自客戶端的請求時,該方法就會一直阻塞,如果有通過 setSoTimeout 方法設(shè)置超時時間,那么 accept 只會在超時間內(nèi)阻塞,過了超時時間就會拋出異常。
bind 和 accept 方法底層都是 native 方法實現(xiàn),我們就不看源碼了。
答:兩者我們都可以稱為套接字,底層基于 TCP/UDP 協(xié)議,套接字對底層協(xié)議進行了封裝,讓我們使用時更加方便,Socket 常被使用在客戶端,用于向服務(wù)端請求數(shù)據(jù)和接受響應(yīng),ServerSocket 常用于在服務(wù)端,用于接受客戶端的請求并進行處理,兩者其底層使用都是依靠 SocketImpl 的子類的 native 方法。
答:SocketOptions 類有很多屬性設(shè)置,比如 SO_TIMEOUT 、SO_LINGER 等等,這些問題說一下自己的理解即可
答:可以的,Socket 有三個參數(shù)的構(gòu)造器,第三個參數(shù)表示你想使用 TCP 還是 UDP。
答:有的,我們可以通過 setKeepAlive 方法來激活該功能,如果兩小時內(nèi),客戶端和服務(wù)端的套接字之間沒有任何通信,TCP 會自動發(fā)送 keepalive 探測給服務(wù)端,預(yù)測服務(wù)端有三種情況:
服務(wù)端使用預(yù)期的 ACK 回復(fù),說明一切正常;
服務(wù)端回復(fù) RST,表示服務(wù)端處于死機或者重啟狀態(tài),終止連接;
沒有得到服務(wù)端的響應(yīng)(會嘗試多次),表示套接字已經(jīng)關(guān)閉了。
但我們并不建議使用這種方式,我們可以自己起一個定時任務(wù),定時的訪問服務(wù)端的特殊接口,如果服務(wù)端返回的數(shù)據(jù)和預(yù)期一致,說明服務(wù)端是存活的。
讀到這里,這篇“客戶端Socket與服務(wù)端ServerSocket串聯(lián)實現(xiàn)網(wǎng)絡(luò)通信的方法”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。