- 本文參考http://www.reibang.com/p/089fb79e308b精簡(jiǎn)并結(jié)合自己的一點(diǎn)理解,所參考的文章更為詳細(xì)
一.Socket定義
套接字钟哥,是應(yīng)用層 與 TCP/IP 協(xié)議族通信的中間軟件抽象層矿酵,表現(xiàn)為一個(gè)封裝了 TCP / IP協(xié)議族 的編程接口(API)
- Socket不是一種協(xié)議浪箭,而是一個(gè)編程調(diào)用接口(API),屬于傳輸層(主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸),在Android上凡恍,我們通過(guò)Socket來(lái)進(jìn)行基于TCP或UDP協(xié)議的網(wǎng)絡(luò)通信開發(fā)
- 成對(duì)出現(xiàn)志秃,一對(duì)套接字:
Socket ={(IP地址1:PORT端口號(hào)),(IP地址2:PORT端口號(hào))}
- 一個(gè) Socket 實(shí)例 唯一代表一個(gè)主機(jī)上的一個(gè)應(yīng)用程序的通信鏈路
示意圖:
通信原理圖:
二.建立連接過(guò)程
客戶端
- 創(chuàng)建一個(gè)Socket實(shí)例嚼酝,構(gòu)造方法傳入
ip
和port
- 在創(chuàng)建Socket實(shí)例的構(gòu)造函數(shù)返回前浮还,會(huì)調(diào)用
connect(SocketAddress endpoint)
去建立連接,TCP的話會(huì)三次握手 - 連接建立以后通過(guò)
socket.getInputStream()
和socket.getOutputStream()
來(lái)與服務(wù)端進(jìn)行通信
服務(wù)端
- 創(chuàng)建一個(gè)ServerSocket實(shí)例闽巩,傳入監(jiān)聽的
port
- 調(diào)用
accept()
方法钧舌,將進(jìn)入阻塞狀態(tài),等待客戶端的請(qǐng)求 - 當(dāng)一個(gè)新請(qǐng)求到來(lái)時(shí)涎跨,將
accept
方法將創(chuàng)建一個(gè)新的Socket
套接字返回 - 連接建立以后通過(guò)
socket.getInputStream()
和socket.getOutputStream()
來(lái)與服務(wù)端進(jìn)行通信
三.使用步驟
- 這里僅就TCP而言舉例
// 步驟1:創(chuàng)建客戶端 & 服務(wù)器的連接
// 創(chuàng)建Socket對(duì)象 & 指定服務(wù)端的IP及端口號(hào)
Socket socket = new Socket("192.168.1.32", 1989);
// 判斷客戶端和服務(wù)器是否連接成功
socket.isConnected());
// 步驟2:客戶端 & 服務(wù)器 通信
// 通信包括:客戶端 接收服務(wù)器的數(shù)據(jù) & 發(fā)送數(shù)據(jù) 到 服務(wù)器
<-- 操作1:接收服務(wù)器的數(shù)據(jù) -->
// 步驟1:創(chuàng)建輸入流對(duì)象InputStream
InputStream is = socket.getInputStream()
// 步驟2:創(chuàng)建輸入流讀取器對(duì)象 并傳入輸入流對(duì)象
// 該對(duì)象作用:獲取服務(wù)器返回的數(shù)據(jù)
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
// 步驟3:通過(guò)輸入流讀取器對(duì)象 接收服務(wù)器發(fā)送過(guò)來(lái)的數(shù)據(jù)
br.readLine()洼冻;
<-- 操作2:發(fā)送數(shù)據(jù) 到 服務(wù)器 -->
// 步驟1:從Socket 獲得輸出流對(duì)象OutputStream
// 該對(duì)象作用:發(fā)送數(shù)據(jù)
OutputStream outputStream = socket.getOutputStream();
// 步驟2:寫入需要發(fā)送的數(shù)據(jù)到輸出流對(duì)象中
outputStream.write(("Carson_Ho"+"\n").getBytes("utf-8"));
// 特別注意:數(shù)據(jù)的結(jié)尾加上換行符才可讓服務(wù)器端的readline()停止阻塞
// 步驟3:發(fā)送數(shù)據(jù)到服務(wù)端
outputStream.flush();
// 步驟3:斷開客戶端 & 服務(wù)器 連接
socket.close();