https://heapdump.cn/monographic/detail/41/4591445
當今網際網路中的大千世界都駐足於TCP/IP協議之上。而透過Socket操作TCP/IP協議已經成為了事實上的標準,Socket甚至已經成為了網路程式設計的同義詞。當然了,由於我們早已習慣於各種封裝/框架,很少裸用Socket,所以對它的理解始終有一種模糊的感覺。
今天,我就來介紹一下Socket。
Socket
socket在網路程式設計中被翻譯為套接字。它的本意是插座,把它用來表示網路通訊的介面確實很貼切。你看,兩個需要通訊的機器把他們的線纜插上插座(Socket),就可以通訊了。
Socket處於程式設計的什麼位置
socket在程式設計師看來其實就是一個操作網路的API,應用程式透過Socket來和核心層面的tcp/ip等例程進行互動,最後由網路卡發到整個網路上。
當然了,Socket不僅僅是TCP的API,UDP、IP甚至其它一些協議也用Socket來操作。由於它是個普遍的標準,所以基本一切可供應用層使用的協議API都和Socket有關。
平常的Socket都用到哪
一般應用裡面只要和別人通訊,都需要socket。無論是http、dubbo還是jdbc,林林總總,有通訊的地方都有socket。
為什麼Socket這麼流行
為什麼Socket這麼流行,已經成為了網路程式設計的同義詞呢?其實就是由於其提供了非常簡潔的介面。除了開啟方式稍稍有些複雜之外,其它和讀檔案一樣,只需要read/write即可。
Socket和連線之間的關係
一對相互通訊的socket就組成了我們天天掛在嘴邊的連線,一般(本端ip:port,協議,對端ip:port)組成一個唯一的連線。
Client端socket以及Server端socket
就TCP來說,Socket分為Client端和Server端兩種。就以一個簡單的Java時間伺服器為例
看下,程式碼的編寫方法。
這邊client端採用的是短連線的方式連線server端,而server端用的是單執行緒處理socket的方式。採用的都是最簡單的方案。其中有一個細節,如果需要讓socket.read返回-1,那麼對端的socket必須shutdown或者close才行。下圖就是我們的處理流程:
上面的程式碼筆者放在碼雲上面,有需要的同學可以去碼雲下載
git clone https://gitee.com/alchemystar/zero
總結
Socket由於其簡潔的API被廣泛使用,到現在已經成為了網路程式設計的同義詞。正是由於其簡潔性和易用性,在我們程式猿的手上演化出各種複雜的用法(阻塞/非阻塞,短連線/長連線,超時…),後面筆者會一一道來。