<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
上一小節我們學習了 Socket,本文我們來看看伺服器端通訊端 API:ServerSocket,本文學習完畢之後,我們就可以把使用者端 Socket 和伺服器端 ServerSocket 串聯起來,做一個真實的網路通訊的 demo 了。
ServerSocket 的主要作用,是作為伺服器端的通訊端,接受使用者端通訊端傳遞過來的資訊,並把響應回傳給使用者端,其屬性非常簡單,如下:
private boolean created = false;// 已建立 private boolean bound = false;// 繫結 private boolean closed = false;// 已關閉 // 底層的功能都依靠 SocketImpl 來實現 private SocketImpl impl;
ServerSocket 和 Socket 一樣,底層都是依靠 SocketImpl 的能力,而 SocketImpl 底層能力的實現基本上都是 native 方法實現的。
初始化大概可以分成兩類:無參構造器和有參構造器。
無參構造器做的事情比較簡單,只指定了 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 地址。
bind 方法主要作用是把 ServerSocket 繫結到原生的埠上,只有當我們使用無參構造器初始化 ServerSocket 時,才會用到這個方法,如果使用有參構造器的話,在初始化時就已經繫結到原生的埠上了。
配合無參構造器,一般我們這麼用:
// 進行初始化 ServerSocket serverSocket = new ServerSocket(); // 進行繫結 serverSocket.bind(new InetSocketAddress("localhost", 7007));
accept 方法主要是用來 ServerSocket 接受來自使用者端的通訊端的,如果此時沒有來自使用者端的請求時,該方法就會一直阻塞,如果有通過 setSoTimeout 方法設定超時時間,那麼 accept 只會在超時間內阻塞,過了超時時間就會丟擲異常。
bind 和 accept 方法底層都是 native 方法實現,我們就不看原始碼了。
答:兩者我們都可以稱為通訊端,底層基於 TCP/UDP 協定,通訊端對底層協定進行了封裝,讓我們使用時更加方便,Socket 常被使用在使用者端,用於向伺服器端請求資料和接受響應,ServerSocket 常用於在伺服器端,用於接受使用者端的請求並進行處理,兩者其底層使用都是依靠 SocketImpl 的子類的 native 方法。
答:SocketOptions 類有很多屬性設定,比如 SO_TIMEOUT 、SO_LINGER 等等,這些問題說一下自己的理解即可,可以參考 《Socket 原始碼及面試題》 中對各種屬性的解析。
答:可以的,Socket 有三個引數的構造器,第三個參數列示你想使用 TCP 還是 UDP。
答:有的,我們可以通過 setKeepAlive 方法來啟用該功能,如果兩小時內,使用者端和伺服器端的通訊端之間沒有任何通訊,TCP 會自動傳送 keepalive 探測給伺服器端,預測伺服器端有三種情況:
但我們並不建議使用這種方式,我們可以自己起一個定時任務,定時的存取伺服器端的特殊介面,如果伺服器端返回的資料和預期一致,說明伺服器端是存活的。
Socket 和 ServerSocket 在原始碼方面沒啥特別可說的地方,基本都是一些設定,底層實現都是 native 的方法,但面試官會從此延伸到一些網路協定方面的知識,因為這已經超出本專欄的範疇了,感興趣的同學可以自行百度。
以上就是使用者端Socket與伺服器端ServerSocket串聯實現網路通訊的詳細內容,更多關於Socket與ServerSocket串聯實現網路通訊的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45