《Android》『Socket』- 如何透過 Socket 連線連接用戶端與伺服端程式

《Android Developers 參考文獻》

➥Socket

 

《繼承架構》

extends Object
implements Closeable


java.lang.Object

↳ java.net.Socket

 

《簡單介紹》

一個網路連線,事實上就是兩個機器的兩個程式之間的連線,我們根據 IP 來區別主機、再根據 Port 來區別程式,而一個 Socket 連線(單向),就是由一個 IP 與一個 Port 來定義的,我們可以把它當作兩個程式與 TCP/IP 連線之間的界面。

 

《程式範例》

要建立一個 Socket 連線,我們必須寫兩支程式,分別代表 Client 端以及 Server 端,而 Socket 連線又分為兩種協議,分別是 TCP 以及 UDP,這兩種連線的差別在於,TCP 提供的是一個連線導向(Connection Oriented)的可靠傳輸,UDP 則是一個非連線型(Connectionless)的非可靠傳輸協定。這邊先來介紹建立 TCP 協議的 Socket 連線之方式,以下直接透過程式碼片段,說明實作的方式。

Client 端

在 Client 端我們宣告了一個繼承 Socket 類別的物件,取名為 clientSocket,在其建構子宣告的當下就會嘗試對指定的 IP 與 Port 建立連線,接著我們用一個 while 迴圈持續檢查 clientSocket.isConnected() 的回傳值,以偵測是否已連線成功並持續的抓取資料,在這迴圈中我們是透過 BufferedReader 物件的 readLine() 方法抓取資料,之後也可以透過 BufferedWriter 物件的 write() 方法傳送資料,換句話說,只要連線是成功的,我們就可以透過 BufferedReader 搭配 InputStreamReader 讀取 Server 端傳來的資料,或者透過 BufferedWriter 搭配 OutputStreamWriter 將資料由 Cleint 端傳給 Server 端。

註:10.0.2.2 是運行 Android Studio 的手機模擬器時,訪問本地端(localhost)的網址,在程式開發時若 Server 端也在同一台電腦上,可以直接使用。

Server 端

在 Server 端我們宣告了一個繼承 ServerSocket 類別的物件,取名為 serverSocket,在其建構子宣告的當下就會針對傳入的 Port 啟動 Server,我們接著利用一個 while 迴圈持續檢查 serverSocket.isClosed() 的回傳值是否為 false,當回傳值為 false 時,表示發現了一個 Client 連線的請求,接著調用serverSocket.accept() 來連接 Client 端,此 accept() 方法會回傳一個 Socket 物件,最後我們用一個 while 迴圈持續檢查 socket.isConnected() 的回傳值,以偵測是否已連線成功並持續的抓取由 Client 端傳來的資料。

 

由於 Server 端可能建立了不只一個的 Socket 連線,因此這邊我們還可以透過自訂的 castMsg() 方法,將資料傳給所有 Client 端。

 

賽肥膩膩

我們是低調到不行的肥膩夫妻檔,一路上一邊吵鬧一邊記錄著生活大小事,偶爾一起暴飲暴食再偶爾一起節食減肥,最沒恆心與毅力但一路走來也持續減肥了好幾次,我們重量不重質,所以完全沒有效果也是理所當然的事。

上 / 下一篇文章

臉書留言

一般留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料