1TCP協(xié)議:類似已婚家庭可靠性高需要三次握手需要對方反饋是否收到若其中一端關(guān)閉服務(wù)端也會跟著關(guān)閉TCP比較專一(啟動時(shí)要先開啟服務(wù)端在開啟客戶端)
需要2端服務(wù)端(Server)
```javascript
package org.example;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[]args)throws Exception {
System.out.println("----服務(wù)端啟動成功-------" );
//創(chuàng)建Server對象,同時(shí)為服務(wù)端注冊端口
? ? ? ? ServerSocket serverSocket=new ServerSocket(8888);
//? ? ? ? 需要使用Server對象,使用一個(gè)accept方法,等待客戶端的連接請求
? ? ? ? Socket socket=serverSocket.accept();
//? ? ? ? 從socket通信管道中得到一個(gè)字節(jié)輸入流
? ? ? ? InputStream is=socket.getInputStream();
//? ? ? ? 把原始的字節(jié)輸入流包裝成數(shù)據(jù)輸入流
? ? ? ? DataInputStream dis=new DataInputStream(is);
while (true) {
//? ? ? ? 使用數(shù)據(jù)輸入流讀取客戶端發(fā)送過來的消息
? ? ? ? ? ? try {
String rs=dis.readUTF();
System.out.println(rs);
//? ? ? ? 獲取客戶端的IP地址
? ? ? ? ? ? ? ? System.out.println(socket.getRemoteSocketAddress());
}catch (IOException e) {
System.out.println(socket.getRemoteSocketAddress()+"離線了:");
dis.close();
socket.close();
break;
}
//? ? ? ? ? ? dis.close();
//? ? ? ? ? ? socket.close();
? ? ? ? }
}
}
```
客戶端(Client)
```javascript
import java.io.IOException;a
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[]args)throws Exception {
//? ? ? ? 創(chuàng)建socket對象
? ? ? ? Socket socket=new? Socket("127.0.0.1",8888);
//? ? ? ? 從socket通信管道中得到一個(gè)字節(jié)輸出流,用來 發(fā)數(shù)據(jù)給服務(wù)程序.
? ? ? ? OutputStream os =socket.getOutputStream();
//把低級的字節(jié)輸出流包裝成數(shù)據(jù)輸出流
? ? ? ? DataOutputStream dos =new DataOutputStream(os);
Scanner sc=new Scanner(System.in);
while (true) {
System.out.println("請輸入");
String msg=sc.nextLine();
if ("exit".equals(msg)){
System.out.println("歡迎您下次光臨,突出成功!");
break;
}
dos.writeUTF(msg);
dos.flush();
//? ? ? ? 開始寫數(shù)據(jù)出去了
//? ? ? ? ? ? dos.writeUTF("在一起,好嗎?");
? ? ? ? }
//? ? ? ? dos.close();
//
//
//? ? ? ? socket.close();
? ? }
}
```
TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層協(xié)議驱犹。它是互聯(lián)網(wǎng)協(xié)議套件中的一部分檩咱,用于在網(wǎng)絡(luò)上可靠地傳輸數(shù)據(jù)扎附。
以下是 TCP 協(xié)議的一些關(guān)鍵特點(diǎn):
面向連接:在通信之前膨处,客戶端和服務(wù)器之間建立一個(gè)連接宇姚。連接的建立包括三次握手過程尝哆,確保雙方都準(zhǔn)備好發(fā)送和接收數(shù)據(jù)秉撇。
可靠性:TCP 提供了可靠的數(shù)據(jù)傳輸。它通過序列號、確認(rèn)應(yīng)答和重傳機(jī)制來確保數(shù)據(jù)的可靠性琐馆。如果發(fā)送方發(fā)送的數(shù)據(jù)包丟失或損壞规阀,接收方會請求重傳,直到數(shù)據(jù)正確接收為止瘦麸。
流量控制:TCP 使用滑動窗口機(jī)制來進(jìn)行流量控制谁撼。接收方可以通知發(fā)送方其可接收的數(shù)據(jù)量,以避免發(fā)送過多數(shù)據(jù)導(dǎo)致網(wǎng)絡(luò)擁塞或接收方緩沖區(qū)溢出滋饲。
擁塞控制:TCP 通過擁塞窗口和擁塞避免算法來處理網(wǎng)絡(luò)擁塞厉碟。當(dāng)網(wǎng)絡(luò)出現(xiàn)擁塞時(shí),TCP 會降低發(fā)送速率以減輕網(wǎng)絡(luò)負(fù)載屠缭,并且在逐漸增加發(fā)送速率時(shí)監(jiān)測網(wǎng)絡(luò)的擁塞情況箍鼓。
面向字節(jié)流:TCP 是一種面向字節(jié)流的協(xié)議,它將數(shù)據(jù)視為連續(xù)的字節(jié)流呵曹,而不是分割成消息或數(shù)據(jù)包款咖。因此,應(yīng)用層協(xié)議需要定義消息的邊界奄喂。
全雙工通信:TCP 連接是全雙工的铐殃,意味著客戶端和服務(wù)器可以同時(shí)發(fā)送和接收數(shù)據(jù),實(shí)現(xiàn)雙向通信跨新。
TCP 協(xié)議在許多網(wǎng)絡(luò)應(yīng)用中廣泛使用富腊,包括網(wǎng)頁瀏覽、電子郵件域帐、文件傳輸?shù)茸副弧K峁┝丝煽康臄?shù)據(jù)傳輸和連接管理,適用于需要確保數(shù)據(jù)完整性和可靠性的場景俯树。
2UDP協(xié)議:類似舔狗 單相思 不懼可靠性只管發(fā)出不管對方是否接收? (啟動時(shí)要先開啟服務(wù)端在開啟客戶端)
服務(wù)端(Server)
```javascript
package org.example;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[]args) {
try {
ServerSocket serverSocket =new ServerSocket(8888);
System.out.println("服務(wù)端已啟動帘腹,等待客戶端連接...");
Socket socket =serverSocket.accept();
System.out.println("客戶端已連接");
BufferedReader br =new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter bw =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader consoleReader =new BufferedReader(new InputStreamReader(System.in));
new Thread(() -> {
String input;
try {
while ((input =br.readLine()) !=null) {
System.out.println("客戶端:" +input);
}
}catch (Exception e) {
e.printStackTrace();
}
}).start();
String output;
while (true) {
System.out.print("服務(wù)端:");
output =consoleReader.readLine();
bw.write(output);
bw.newLine();
bw.flush();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
```
客戶端(Client)
```javascript
package org.example;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class Client {
public static void main(String[]args) {
try {
Socket socket =new Socket("localhost",8888);
BufferedReader br =new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter bw =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader consoleReader =new BufferedReader(new InputStreamReader(System.in));
new Thread(() -> {
String input;
try {
while ((input =br.readLine()) !=null) {
System.out.println("服務(wù)端:" +input);
}
}catch (Exception e) {
e.printStackTrace();
}
}).start();
String output;
while (true) {
System.out.print("客戶端:");
output =consoleReader.readLine();
bw.write(output);
bw.newLine();
bw.flush();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
```
UDP(用戶數(shù)據(jù)報(bào)協(xié)議)是一種無連接的、不可靠的许饿、面向數(shù)據(jù)報(bào)的傳輸層協(xié)議阳欲。與TCP相比,UDP更加簡單陋率,因?yàn)樗惶峁┻B接狀態(tài)跟蹤球化、流量控制和擁塞控制等功能。UDP協(xié)議的特點(diǎn)包括:
無連接性:UDP是一種無連接的協(xié)議瓦糟,也就是說在數(shù)據(jù)傳輸前不需要建立連接筒愚。每個(gè)數(shù)據(jù)包都是獨(dú)立的,相互之間沒有關(guān)聯(lián)菩浙。
不可靠性:UDP不保證數(shù)據(jù)傳輸?shù)目煽啃猿膊簟K惶峁┲貍鳈C(jī)制句伶,如果數(shù)據(jù)包在傳輸過程中丟失、損壞或順序錯(cuò)亂陆淀,UDP不會自動進(jìn)行重傳或糾正錯(cuò)誤考余。
面向數(shù)據(jù)報(bào):UDP是一種面向數(shù)據(jù)報(bào)的協(xié)議,意味著數(shù)據(jù)以數(shù)據(jù)包的形式進(jìn)行傳輸轧苫。每個(gè)數(shù)據(jù)包都有固定的大小限制楚堤,超出限制的數(shù)據(jù)將被分割或丟棄。
低延遲:由于UDP不需要建立連接和維護(hù)連接狀態(tài)含懊,因此具有較低的延遲身冬。這使得UDP適用于實(shí)時(shí)應(yīng)用,如音頻和視頻流傳輸岔乔。
適用于廣播和多播:UDP支持廣播和多播傳輸酥筝,可以將數(shù)據(jù)包同時(shí)發(fā)送給多個(gè)接收方。
簡單輕量:UDP的實(shí)現(xiàn)相對簡單重罪,開銷較小樱哼。它不像TCP那樣復(fù)雜,不需要維護(hù)連接狀態(tài)和緩沖區(qū)剿配,因此在某些情況下更適合要求輕量級通信的應(yīng)用。
UDP常用于不需要可靠性保證的應(yīng)用阅束,如DNS查詢呼胚、NTP時(shí)間同步、實(shí)時(shí)音視頻傳輸?shù)认⒙恪T谶@些應(yīng)用中蝇更,傳輸速度和實(shí)時(shí)性更為重要,而數(shù)據(jù)的丟失或錯(cuò)誤可以通過應(yīng)用層協(xié)議來處理
3HTTP協(xié)議:
HTTP(超文本傳輸協(xié)議)是一種用于傳輸超文本(如HTML)數(shù)據(jù)的應(yīng)用層協(xié)議呼盆。它是互聯(lián)網(wǎng)上應(yīng)用最廣泛的協(xié)議之一年扩,用于在客戶端和服務(wù)器之間傳輸和交換數(shù)據(jù)。以下是HTTP協(xié)議的一些關(guān)鍵特點(diǎn):
無連接:HTTP是一種無連接的協(xié)議访圃,每個(gè)請求-響應(yīng)交換都是獨(dú)立的厨幻,服務(wù)器不會保存客戶端的連接狀態(tài)。這意味著每個(gè)請求都是一個(gè)獨(dú)立的事務(wù)腿时,服務(wù)器處理完請求后即斷開連接况脆。
無狀態(tài):HTTP是一種無狀態(tài)的協(xié)議,即服務(wù)器不會保存客戶端的狀態(tài)信息批糟。每個(gè)請求都是相互獨(dú)立的格了,服務(wù)器不會記住之前的請求或會話狀態(tài)。為了維護(hù)狀態(tài)徽鼎,通常需要使用會話機(jī)制盛末,如cookie或session弹惦。
基于請求-響應(yīng)模型:HTTP通信采用請求-響應(yīng)模型∏牡客戶端發(fā)送HTTP請求到服務(wù)器棠隐,服務(wù)器處理請求并返回HTTP響應(yīng)給客戶端。請求和響應(yīng)包含了一些元數(shù)據(jù)(如頭部信息)和可選的數(shù)據(jù)主體算墨。
支持多種請求方法:HTTP定義了多種請求方法宵荒,包括GET、POST净嘀、PUT报咳、DELETE等。每種方法有不同的語義挖藏,用于執(zhí)行不同的操作暑刃,如獲取資源、提交數(shù)據(jù)膜眠、更新資源等岩臣。
基于文本協(xié)議:HTTP使用文本格式進(jìn)行通信,請求和響應(yīng)都是由ASCII文本組成的宵膨。這使得HTTP消息易于閱讀架谎、調(diào)試和理解,但也增加了通信的開銷辟躏。
無加密:HTTP本身不提供數(shù)據(jù)加密功能谷扣,傳輸?shù)臄?shù)據(jù)是明文的。為了安全傳輸敏感信息捎琐,可以使用HTTPS(HTTP Secure)会涎,它在HTTP上加入了SSL/TLS加密層。
HTTP被廣泛用于Web瀏覽器和Web服務(wù)器之間的通信瑞凑,用于獲取網(wǎng)頁末秃、圖像、視頻等資源籽御。除了Web瀏覽器练慕,許多其他應(yīng)用程序和服務(wù)也使用HTTP進(jìn)行通信,如API接口篱蝇、移動應(yīng)用程序贺待、IoT設(shè)備等。