網(wǎng)絡(luò)通信編程

1TCP協(xié)議:類似已婚家庭可靠性高需要三次握手需要對(duì)方反饋是否收到若其中一端關(guān)閉服務(wù)端也會(huì)跟著關(guān)閉TCP比較專一(啟動(dòng)時(shí)要先開啟服務(wù)端在開啟客戶端)

需要2端服務(wù)端(Server)

```java

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ù)端啟動(dòng)成功-------" );

//創(chuàng)建Server對(duì)象,同時(shí)為服務(wù)端注冊(cè)端口

? ? ? ? ServerSocket serverSocket=new ServerSocket(8888);

//? ? ? ? 需要使用Server對(duì)象,使用一個(gè)accept方法,等待客戶端的連接請(qǐng)求

? ? ? ? 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對(duì)象

? ? ? ? Socket socket=new? Socket("127.0.0.1",8888);

//? ? ? ? 從socket通信管道中得到一個(gè)字節(jié)輸出流,用來 發(fā)數(shù)據(jù)給服務(wù)程序.

? ? ? ? OutputStream os =socket.getOutputStream();

//把低級(jí)的字節(jié)輸出流包裝成數(shù)據(jù)輸出流

? ? ? ? DataOutputStream dos =new DataOutputStream(os);

Scanner sc=new Scanner(System.in);

while (true) {

System.out.println("請(qǐng)輸入");

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ù)傳輸。它通過序列號(hào)迟几、確認(rèn)應(yīng)答和重傳機(jī)制來確保數(shù)據(jù)的可靠性消请。如果發(fā)送方發(fā)送的數(shù)據(jù)包丟失或損壞,接收方會(huì)請(qǐng)求重傳类腮,直到數(shù)據(jù)正確接收為止臊泰。

流量控制:TCP 使用滑動(dòng)窗口機(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 會(huì)降低發(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ā)出不管對(duì)方是否接收? (啟動(dòng)時(shí)要先開啟服務(wù)端在開啟客戶端)

服務(wù)端(Server)

```java

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ù)端已啟動(dòng),等待客戶端連接...");

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)

```

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不會(huì)自動(dòng)進(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)相對(duì)簡單,開銷較小旷余。它不像TCP那樣復(fù)雜绢记,不需要維護(hù)連接狀態(tài)和緩沖區(qū),因此在某些情況下更適合要求輕量級(jí)通信的應(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è)請(qǐng)求-響應(yīng)交換都是獨(dú)立的,服務(wù)器不會(huì)保存客戶端的連接狀態(tài)翘骂。這意味著每個(gè)請(qǐng)求都是一個(gè)獨(dú)立的事務(wù)壁熄,服務(wù)器處理完請(qǐng)求后即斷開連接帚豪。

無狀態(tài):HTTP是一種無狀態(tài)的協(xié)議,即服務(wù)器不會(huì)保存客戶端的狀態(tài)信息草丧。每個(gè)請(qǐng)求都是相互獨(dú)立的狸臣,服務(wù)器不會(huì)記住之前的請(qǐng)求或會(huì)話狀態(tài)。為了維護(hù)狀態(tài)昌执,通常需要使用會(huì)話機(jī)制烛亦,如cookie或session。

基于請(qǐng)求-響應(yīng)模型:HTTP通信采用請(qǐng)求-響應(yīng)模型懂拾∶呵荩客戶端發(fā)送HTTP請(qǐng)求到服務(wù)器,服務(wù)器處理請(qǐng)求并返回HTTP響應(yīng)給客戶端岖赋。請(qǐng)求和響應(yīng)包含了一些元數(shù)據(jù)(如頭部信息)和可選的數(shù)據(jù)主體檬果。

支持多種請(qǐng)求方法:HTTP定義了多種請(qǐng)求方法,包括GET唐断、POST选脊、PUT、DELETE等脸甘。每種方法有不同的語義恳啥,用于執(zhí)行不同的操作,如獲取資源丹诀、提交數(shù)據(jù)钝的、更新資源等。

基于文本協(xié)議:HTTP使用文本格式進(jìn)行通信忿墅,請(qǐng)求和響應(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接口花嘶、移動(dòng)應(yīng)用程序笋籽、IoT設(shè)備等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末椭员,一起剝皮案震驚了整個(gè)濱河市车海,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隘击,老刑警劉巖侍芝,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異埋同,居然都是意外死亡州叠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門莺禁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來留量,“玉大人,你說我怎么就攤上這事哟冬。” “怎么了忆绰?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵浩峡,是天一觀的道長。 經(jīng)常有香客問我错敢,道長翰灾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任稚茅,我火速辦了婚禮纸淮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亚享。我一直安慰自己咽块,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布欺税。 她就那樣靜靜地躺著侈沪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晚凿。 梳的紋絲不亂的頭發(fā)上亭罪,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音歼秽,去河邊找鬼应役。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的箩祥。 我是一名探鬼主播院崇,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼滥比!你這毒婦竟也來了亚脆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤盲泛,失蹤者是張志新(化名)和其女友劉穎濒持,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寺滚,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柑营,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了村视。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官套。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚁孔,靈堂內(nèi)的尸體忽然破棺而出奶赔,到底是詐尸還是另有隱情,我是刑警寧澤杠氢,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布站刑,位于F島的核電站,受9級(jí)特大地震影響鼻百,放射性物質(zhì)發(fā)生泄漏绞旅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一温艇、第九天 我趴在偏房一處隱蔽的房頂上張望因悲。 院中可真熱鬧,春花似錦勺爱、人聲如沸晃琳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝎土。三九已至,卻和暖如春绣否,著一層夾襖步出監(jiān)牢的瞬間誊涯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工蒜撮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暴构,地道東北人跪呈。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像取逾,于是被迫代替她去往敵國和親耗绿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容