TCP/IP參考模型
TCP/IP參考模型是首先由ARPANET所使用的網(wǎng)絡(luò)體系結(jié)構(gòu)。這個(gè)體系結(jié)構(gòu)在它的兩個(gè)主要協(xié)議出現(xiàn)以后被稱為T(mén)CP/IP參考模型(TCP/IP Reference Model)。這一網(wǎng)絡(luò)協(xié)議共分為四層:網(wǎng)絡(luò)訪問(wèn)層、互聯(lián)網(wǎng)層、傳輸層和應(yīng)用層。如下圖:

TCP簡(jiǎn)介
TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793定義。在簡(jiǎn)化的計(jì)算機(jī)網(wǎng)絡(luò)OSI模型中,它完成第四層傳輸層所指定的功能,用戶數(shù)據(jù)報(bào)協(xié)議(UDP)是同一層內(nèi) 另一個(gè)重要的傳輸協(xié)議。在因特網(wǎng)協(xié)議族(Internet protocol suite)中,TCP層是位于IP層之上,應(yīng)用層之下的中間層。不同主機(jī)的應(yīng)用層之間經(jīng)常需要可靠的、像管道一樣的連接,但是IP層不提供這樣的流機(jī)制,而是提供不可靠的包交換。
基于Socket的TCP編程
TCP通信中包含服務(wù)端和客戶端,下面分別講述。
服務(wù)端
第一步 創(chuàng)建ServerSocket實(shí)例;
第二步 調(diào)用ServerSocket的accept()方法,等待客戶端連接;
第三步 客戶端連接上服務(wù)端之后,數(shù)據(jù)讀寫(xiě)。
下面貼上示例代碼:
public class Server extends Base {
private ServerSocket mServerSocket;
private Socket mSocket;
public Server(BaseListener listener) {
super(listener);
}
public void start() {
new Thread(new Runnable() {
@Override
public void run() {
try {
mServerSocket = new ServerSocket(8090);
mSocket = mServerSocket.accept();
mHandler.sendMsgConnected();
recv();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public void stop() {
if (mServerSocket != null) {
try {
mServerSocket.close();
mServerSocket = null;
mHandler.sendMsgDisconnected();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void recv() {
if (mSocket == null) {
return;
}
try {
InputStream is = mSocket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
int i = 0;
String content;
while ((content = reader.readLine()) != null) {
mHandler.sendMsgRecv(content);
send("hello world:" + (i++));
}
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean send(@NonNull String content) {
if (mSocket == null || !mSocket.isConnected()) {
return false;
}
try {
OutputStream os = mSocket.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os));
writer.write(content + "\n");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
}
客戶端
第一步 創(chuàng)建Socket實(shí)例;
第二步 連接上服務(wù)端之后,讀寫(xiě)數(shù)據(jù)。
下面貼上示例代碼:
public class Client extends Base {
private Socket mSocket;
public Client(BaseListener listener) {
super(listener);
}
public void start() {
new Thread(new Runnable() {
@Override
public void run() {
if (mSocket != null) {
try {
mSocket.close();
mHandler.sendMsgDisconnected();
} catch (IOException e) {
e.printStackTrace();
return;
}
}
try {
mSocket = new Socket("127.0.0.1", 8090);
mHandler.sendMsgConnected();
read();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public void stop() {
if (mSocket != null) {
try {
mSocket.close();
mSocket = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void read() {
if (mSocket == null || !mSocket.isConnected()) {
return;
}
try {
InputStream is = mSocket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String content;
while ((content = reader.readLine()) != null) {
mHandler.sendMsgRecv(content);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean send(@NonNull String content) {
if (mSocket == null || !mSocket.isConnected()) {
return false;
}
try {
OutputStream os = mSocket.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os));
writer.write(content + "\n");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
}