java生下來一開始就是為了計算機之間的通信,因此這篇文章也將開始介紹一下java使用socket進行計算機之間的通信,在上一篇文章中已經對網絡通信方面的基礎知識進行了總結,這篇文章將通過代碼案例來解釋說明。
一、網絡編程基礎
因為java網絡編程這塊是從基礎開始講解的,所以知識點也是由淺入深,因此還是有必要對一些基礎的知識進行回顧和掌握,如果你是大神,不喜勿噴。
1、兩臺計算機之間的通信
兩臺計算機如何實現通信呢?人類交流是通過定義一定的語言,計算機也是,他們之間必須要有相應的協議才可以。
也就是說,兩臺計算機要想通信必須要遵循一定的規則協議。通信流程基本上就是,一臺計算機上的一個埠號數據,然後通過協議發送到另外一臺計算機上的同一個埠號。這裡面有三個重要的部分需要我們去理解一下,當然不會細講,因為在上一篇文章中已經提出。
(1)TCP/IP協議
(2)IP位址
(3)埠
我們先講一下TCP/IP模型。
2、TCP/IP模型
TCP/IP模型就是上面的協議,它定義了一些規則來用於計算機之間的通信,同時也是世界上應用最為廣泛的協議。這個協議模型建立在TCP和IP協議上面(從名字也可以看出來)。
從上圖我們可以看到TCP/IP其實是處於傳輸層的,也就是我們的協議核心所在,TCP/IP協議定義了電子設備如何連入網際網路,以及數據如何在它們之間傳輸的標準。
3、IP位址
為了實現兩個網絡中不同計算機之間的通信,每臺計算機都必須有一個唯一的標識,就是中國公民每一個人都有一個惟一的身份證號碼一樣。
4、埠
我們知道一臺計算機其實是可以跑很多個程序的,那麼我們的程序怎麼就能準確無誤的到達另外一個程序呢?這其實就是使用了埠號來區分不同的應用程式。
埠號的範圍也很大0到65535。其中0到1023是保留的,也就是我們不能用的。那我們的今天所講的socket是如何組成的呢?其實就是由IP位址和埠號組成的。
二、socket通信
在上面其實我們對通訊需要掌握的一些基礎知識進行了分析,這裡我們開始使用java語言來演示一下這個過程。
socket通信其實是有兩種方式:TCP和UDP過程。
(1)TCP是可靠地面向連接的通信過程,含有三次握手四次揮手的機制。
(2)UDP是不可靠的無連接的通信過程,客戶端只管發,不管服務端有沒有接受到。
那這兩種通信方式的基本模型是什麼呢?我們使用一張圖來看一下:、
從上圖我們可以看到,Socket實現的步驟大體包含以下幾個步驟:
(1)創建Server和client的ServerSocket和Socket。
(2)打開連結到Socket的輸入輸出流
(3)按照協議對Socket進行讀取操作
(4)關閉輸入輸出流、關閉Socket。
下面我們就直接來看例子,然後再來分析這個例子:
1、基於TCP的socket通信
我們拿男孩做客戶端,女孩因為有很多人追求,所以做服務端,一個服務端可被多個男孩客戶端請求表白。我們這裡先看女孩服務端的具體步驟:
(1)創建ServerSocket對象,綁定監聽埠。
(2)通過accept()方法監聽客戶端請求
(3)連接建立後,通過輸入流讀取客戶端的數據
(4)通過輸出流,向客戶端回應信息
OK,基本的步驟就是這,我們就看一下代碼。
具體的步驟已經很清晰了,我們再來看看男孩客戶端的步驟:
(1)創建Socket並指定埠
(2)通過輸出流向服務端發送一個請求
(3)等待服務端的回應 獲取輸入流,讀取客戶端信息(將字節流轉化為字符流),並保存在緩衝區中
(4)關閉資源
下面同樣使用java代碼來演示一下。
這就是男孩追求女孩的代碼示例,說起來也很簡單。如果我們之前學習過socket編程,可能上述的這些代碼難不倒我們,不過如果從基礎開始入門學習,還是有必要對其兩個類進行說明一下。高手可跳過:
第一個:Socket
當我們想要在Java中使用TCP/IP通過網絡連接到伺服器時,就需要創建Socket對象並連接到伺服器。在服務端的Socket對應著連接的一個個客戶端。
第二個:ServerSocket
用ServerSocket實現java服務通過TCP/IP監聽客戶端連接,他只存在於服務端。
2、基於UDP的Socket通信
UDP的通信模式其實是無連接的不可靠的通信協議,舉個例子,花心男孩向女孩表白,就給女孩寫了一封情書,然後不管女孩有沒有收到情書,自己繼續向其他女孩表白。我們這裡還是以女孩為服務端。
我們首先來看一下服務端的步驟:
接收客戶端發送的數據
(1)創建伺服器端DatagramSocket指定埠
(2)創建數據報DatagramPacket,接收客戶端發送的數據
(3)接收客戶端發送的數據
(4)讀取數據
向客戶端響應數據
(1)定義客戶端的地址、埠號、數據
(2)創建數據報,包含響應的數據信息
(3)響應客戶端
(4)關閉資源
具體代碼來演示一下。
然後再來看一下客戶端的請求:
向伺服器端發送數據
(1)定義伺服器的地址、埠號、數據
(2)創建數據報,包含發送的數據信息
(3)創建DatagramSocket對象
(4)向伺服器端發送數據報
接收伺服器端響應的數據
(1)創建數據報DatagramPacket,用於接收伺服器端響應的數據
(2)接收伺服器響應的數據
(3)讀取數據
(4)關閉資源
我們再使用java語言來演示一下客戶端代碼
OK,以上就是socket通信的兩種基本方式,這裡只是給出了一個最最簡單的例子演示,這也是最基礎的代碼,後續文章會繼續加深難度。我們現在來總結一下這個Socket通信
從上面我們可以看到Java提供了非常易用的網絡API,調用這些API我們可以很方便的通過建立TCP/IP或UDP套接字,在網絡之間進行相互通信,但是其中TCP要比UDP更加常用。但是在一些場景下面。使用無連接的UDP要優於TCP。