1. 程式人生 > >淺談網路程式設計之Socket

淺談網路程式設計之Socket

前言

此文只是簡單概述Socket,Java程式設計的使用方法,還請移步Java 網路IO程式設計

Socket

Socket是用來連線網路,進行傳輸資料的工具,Scoket大致分為兩種,TCP和UDP
TCP:
服務端:建立Socket->繫結ip和埠號->接聽連線->accept連線
客戶端:建立Socket->connect伺服器

在建立Socket的時候其實並不區分客戶端還是伺服器端,如果繫結ip、埠則為服務端Socket,呼叫connect則為客戶端Socket

Java 網路IO程式設計的Socket使用解讀

在Java網路IO程式設計中,當我們建立一個服務端ServerSocket例項,例如

ServerSocket serverSocket = new ServerSocket(8000);

好像我們並沒有繫結ip?

當我們進入原始碼,就會發現,當ip不傳的時候,它在構造時預設為我們綁定了一個地址——“0.0.0.0”。0.0.0.0代表的是本機所有ip地址,也就是說我們的Socket接收任意來自本機ip的連線,如果構造時傳了ip地址,那麼接收來自固定ip地址的連線。

我們再來看下客戶端

Socket socket = new Socket("127.0.0.1", 8000);

好像不僅沒有呼叫connect,還綁定了ip,埠。

我們再次進入原始碼,就能發現,我們傳進去的ip和埠是用來建立連線的。原始碼就不貼了,大家有興趣可以看下,都很好理解。

當完成訊息傳輸後,服務端和客戶端都會停止執行。

有些小夥伴可能會覺得,在Java裡我明明用的是不同的“Socket”,比如serverSocket類,Socket類。還請注意,本文中的Socket表示的是“套接字”這個概念,而並非某個具體的實現類。其實到原始碼裡會發現,Java程式碼的實際邏輯實現都用到了SocketOptions介面的實現類。

 

Socket的傳輸方式與協議

  • 面向連線的資料傳輸方式:
    保證在傳輸的過程中資料不會消失、按序傳遞資料,並且資料的傳輸是沒有邊界的(比如在Socket程式設計時,TCP包頭中沒有“包長度欄位”)。如果接收端讀取資料的速度慢於傳輸端,導致接收端無法再接收,那麼傳輸端會停止傳輸。如果傳輸出錯還提供重傳服務
    使用此資料傳輸方式的協議:TCP

  • 面向訊息的資料傳輸方式:
    不存在連線的概念
    不可靠的,不按序傳遞,以資料高速傳遞為目的,且每次傳遞的資料大小有限制
    使用此資料傳輸方式的協議:UDP

同一協議族中可能存在多個數據傳輸方式相同的協議。

Socket使用的時候需要指定協議,在Java程式設計中,我們構造Socket時似乎並沒有指定使用的協議。但其實當我們使用Socket類、serverSocket類的時候,內部使用的是TCP協議的實現類;使用DatagramSocket類,MulticastSocket類時,內部使用的是UDP協議的實現類。有興趣可以研究一下SocketImpl 和DatagramSocketImpl

擴充套件
我們平時說的TCP,UDP都屬於TCP/IP協議族,TCP/IP協議並不完全符合OSI的七層參考模型,而是由四個層次組成:鏈路層、網路(IP)層、傳輸層、應用層。我們的TCP,UDP位於傳輸層。

兩臺主機想要通過網路進行資料交換,需要先建立兩臺主機的物理連線(鏈路層負責)

為了在複雜的網路中傳輸資料,需要考慮向目標傳輸資料需要經過哪條路徑(IP層負責)

IP層解決路徑問題後,我們只要按照此路徑傳輸資料即可,傳輸層以IP層提供的路徑資訊為基礎完成實際的資料傳輸。

我們需要根據程式的特點決定伺服器與客戶端之間的資料傳輸規則,這就是應用層協議,網路程式設計大部分內容就是設計實現應用層協議。

向我們提供的工具便是Socket,以上內容都是Socket通訊過程中自動處理的。選擇資料傳輸路徑,資料確認,資料傳輸過程都被隱藏到Socket內部。我們只需要利用Socket編寫出程式即可。

分配給套接字的IP地址和埠號

大家還記得在建立服務端Socket的時候,我們需要繫結埠和ip,我們的埠號並非賦予計算機的值,而是為了區分程式中建立的Socket而分配給Socket的序號。初始化服務端Socket時應分配所屬計算機的IP地址,同一個計算機可以分配多個IP地址,所以我們需要指定接收哪個IP傳來的資料。如上文所述,如果為0.0.0.0,則接收來自該計算機所有ip的連線。

後記

建立一個Socket需要指定協議,ip,埠(不管是用來bind還是connect),建立的套接字時,TCP,UDP協議可以使用同樣的埠號,因為他們的協議是不一樣的。

 

參考書籍:《TCP/IP網路程式設計》(韓)尹聖雨