Socket源码相关——SocketAddress和InetSocketAddress
目錄
- 我的學習過程
- 我的心路歷程
- 思考總結
我的學習過程
昨天學習qiujuer老師的《Socket網絡編程進階與實戰(zhàn)》實戰(zhàn)課程中,寫了一個簡易的client-server聊天項目。我的學習方法是根據(jù)課程的一部分思路提示后,自己獨自進行編寫,出現(xiàn)了很多問題,今天嘗試著從源碼找原因,學習了不少知識。
我的心路歷程
我是用到socket來寫client-server信息傳輸功能,socket包主要用到三個方法:
在使用connect方法時,我嘗試new一個SocketAddress對象作為connect的參數(shù)。結果報錯說:
SocketAddress是抽象的,不能被實例化。
我的操作心路:
我使用command+click進入查看了SocketAddress,發(fā)現(xiàn)它是一個抽象類,是一個不可變對象。源碼指示@see Socket包參考,思維中斷。什么意思呢?為什么要傳一個抽象對象作為參數(shù),卻又無法實例化?
我的操作心路:
對比了課程中的寫法,發(fā)現(xiàn)課程使用的是InetSocketAddress。使用command+click進入,定位到了構造器:
我一開始以為這是一個methed,怎么可以new一個methed作為參數(shù)呢?
我的操作心路:
我選中InetSocketAddress,用command+fn+F12調出所有method,顯示InetSocketAddress(InetAddress, int)前有個小m,這應該也是方法,好奇怪?
我的操作心路:
我把源碼往上拉,發(fā)現(xiàn)InetSocketAddress(InetAddress, int)確實是InetSocketAddress的構造器。真是有點學暈了,哈哈哈。那為什么傳InetSocketAddress對象呢?
我的操作心路:
我百度了一下SocketAddress類和InetSocketAddress類。我發(fā)現(xiàn),SocketAddress是抽象類,InetSocketAddress是前者的唯一子類。是唯一子類嗎?
我的操作心路:
我選中SocketAddress,使用control+H查看了SocketAddress的所有子類,確實只有一個子類InetSocketAddress。進一步通過百度知道,可以使用SocketAddress的默認構造器來使用子類來建立InetSocketAddress對象作為參數(shù)。原來突破點在借助默認構造器和非抽象子類。
思考總結
SocketAddress是一個抽象類,它無法實例化。它只有一個子類InetSocketAddress。當一個抽象類需要“實例化”時,若它具備非抽象的子類,則可以通過抽象類的默認構造器來建立一個實例化的子類對象,實現(xiàn)“實例化”。
總結
以上是生活随笔為你收集整理的Socket源码相关——SocketAddress和InetSocketAddress的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟机配置IP
- 下一篇: 使用acme.sh签发Let's Enc