【Java】–網(wǎng)絡(luò)編程:基于TCP協(xié)議的網(wǎng)絡(luò)通信
一、TCP協(xié)議
1.1 概念
TCP協(xié)議(Transmission Control Protocol),即傳輸控制協(xié)議,是一種面向連接
的,可靠
的,基于字節(jié)流
的傳輸層通信協(xié)議。數(shù)據(jù)大小無(wú)限制。
建立連接的過(guò)程需要三次握手
。
斷開(kāi)連接的過(guò)程需要四次揮手
。
使用TCP協(xié)議的通信雙方分別為客戶端
和服務(wù)器端
。
客戶端負(fù)責(zé)向服務(wù)器端發(fā)送數(shù)據(jù),服務(wù)器端負(fù)責(zé)接收客戶端的數(shù)據(jù)并給出反饋。兩者地位不相同。
1.2 三次握手
1.2.1 文字描述
使用TCP協(xié)議的通信雙方,建立通信連接需要三次握手
,即三個(gè)步驟:
- 客戶端向服務(wù)器端發(fā)送 建立連接請(qǐng)求(SYN) 數(shù)據(jù)包。
- 服務(wù)器端接收到客戶端的SYN包,發(fā)送 確認(rèn)信息(ACK) 數(shù)據(jù)包,表示收到了客戶端發(fā)來(lái)的數(shù)據(jù)包,同時(shí)發(fā)送SYN,請(qǐng)求與客戶端建立連接。
- 客戶端接收到服務(wù)器端發(fā)來(lái)的ACK + SYN數(shù)據(jù)包之后,發(fā)送ACK數(shù)據(jù)包,表示收到了服務(wù)器發(fā)來(lái)的數(shù)據(jù)包。至此,客戶端和服務(wù)器之間建立連接。
1.2.2 畫圖演示
1.3 四次揮手
1.3.1 文字描述
使用TCP協(xié)議的通信雙方,斷開(kāi)已經(jīng)建立的連接需要四次揮手
,即四個(gè)步驟:
- 客戶端向服務(wù)器端發(fā)送 斷開(kāi)連接請(qǐng)求(FIN) 數(shù)據(jù)包。
- 服務(wù)器接收到客戶端的FIN數(shù)據(jù)包,先向客戶端發(fā)送ACK數(shù)據(jù)包,表示收到了客戶端發(fā)來(lái)的數(shù)據(jù)包,并準(zhǔn)備斷開(kāi)客戶端的連接。
- 服務(wù)器處理好斷開(kāi)連接所需事宜后,向客戶端發(fā)送FIN + ACK數(shù)據(jù)包,表示與客戶端斷開(kāi)連接。
- 客戶端接收到服務(wù)器端的FIN + ACK數(shù)據(jù)包,向服務(wù)器端發(fā)送ACK數(shù)據(jù)包,表示收到了服務(wù)器端發(fā)送的數(shù)據(jù)包。至此,客戶端與服務(wù)器端斷開(kāi)連接。
1.3.2 畫圖演示
二、基于TCP的Socket網(wǎng)絡(luò)編程
2.1 概念
Socket(套接字)是由操作系統(tǒng)提供的統(tǒng)一網(wǎng)絡(luò)編程接口
,是網(wǎng)絡(luò)中的一個(gè)通信節(jié)點(diǎn)。
因?yàn)榛赥CP協(xié)議,在使用Socket進(jìn)行網(wǎng)絡(luò)編程時(shí)需要分別進(jìn)行服務(wù)器端的開(kāi)發(fā)和客戶端的開(kāi)發(fā)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-818201.html
2.2 服務(wù)器端的開(kāi)發(fā)步驟
2.2.1 文字描述
- 創(chuàng)建ServerSocket對(duì)象,并指定端口號(hào)。
ServerSocket listener = new ServerSocket(10086);//指定服務(wù)器端的端口號(hào)
- 偵聽(tīng)客戶端的連接,并返回客戶端的套接字。
Socket clientSocket = listener.accept();
//注意:accept()是一個(gè)阻塞方法,在獲得客戶端的套接字之前不會(huì)執(zhí)行后面的代碼。
- 與客戶端建立連接后,通過(guò)輸入流來(lái)獲取客戶端的輸出流。
//用于接收客戶端的數(shù)據(jù)
InputStream is = clientSocket.getInputStream();
//用于向客戶端輸出數(shù)據(jù)
OutputStream os = clientSocket.getOutputStream();
//使用轉(zhuǎn)換流將字節(jié)流轉(zhuǎn)成字符流,并規(guī)定讀取和輸出的編碼格式為UTF-8
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
//將字符流轉(zhuǎn)換成字符緩沖流,效率更高
BufferedReader br = new BufferedReaer(isr);
BufferedWriter bw = new BufferedWriter(osw);
- 處理數(shù)據(jù)
String data = br.readLine();//讀取一行數(shù)據(jù)
System.out.println("客戶端說(shuō):" + data);
String s = "已接收到數(shù)據(jù)";
bw.write(s);//向客戶端發(fā)送反饋
bw.newLine();//換行
bw.flush();//刷新緩存
- 關(guān)閉
listener.close();
clientSocket.close();
is.close();
os.close();
isr.close();
osw.close();
br.close();
bw.close();
2.3 客戶端的開(kāi)發(fā)步驟
2.3.1 文字描述
- 創(chuàng)建客戶端套接字對(duì)象,并指定服務(wù)器端的地址和端口號(hào)。
//指定服務(wù)器端的地址和端口號(hào)
Socket ClientSocket = new Socket("10.9.48.155",10086);
- 獲取輸出流和輸入流
//用于向服務(wù)器端輸出數(shù)據(jù)
OutputStream os = ClientSocket.getOutputStream();
//用于接收服務(wù)器端的反饋
InputStream is = ClientSocket.getInputStream();
//將字節(jié)流通過(guò)轉(zhuǎn)換流轉(zhuǎn)換成字符流
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
InpusStreamReader isr = new InputStreamReader(is,"UTF-8");
//將字符流轉(zhuǎn)換成字符緩沖流,效率更高
BufferedWriter bw = new BufferedWriter(osw);
BufferedReader br = new BufferedReader(isr);
- 處理數(shù)據(jù)并發(fā)送
String s = "好久不見(jiàn),甚是想你";
bw.write(bw);
bw.newLine();//另起一行,令客戶端知道上一行是需要接收的內(nèi)容
bw.flush();//刷新緩存,零數(shù)據(jù)發(fā)送出去
String feedback = br.readLine();
System.out.println("服務(wù)器回應(yīng)道:" + data);
- 關(guān)閉
ClientSocket.close();
os.close();
is.close();
osw.close();
isr.close();
bw.close();
br.close();
總結(jié)
這篇文章講解了什么是網(wǎng)絡(luò)編程,以及在java中如何實(shí)現(xiàn)基于TCP協(xié)議的網(wǎng)絡(luò)編程。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-818201.html
到了這里,關(guān)于【Java】--網(wǎng)絡(luò)編程:基于TCP協(xié)議的網(wǎng)絡(luò)通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!