網(wǎng)絡(luò)編程
什么是計(jì)算機(jī)網(wǎng)絡(luò)?
- 把分布在不同地理區(qū)域的具有獨(dú)立功能的計(jì)算機(jī),通過通信設(shè)備與線路連接起來,由功能完善的軟件實(shí)現(xiàn)資源共享和信息傳遞的系統(tǒng)
簡單來說就是把不同地區(qū)的計(jì)算機(jī)通過設(shè)備連接起來,實(shí)現(xiàn)不同地區(qū)之前的數(shù)據(jù)傳輸
網(wǎng)絡(luò)編程是干什么的?
-
網(wǎng)絡(luò)編程
是借助計(jì)算機(jī)網(wǎng)絡(luò),實(shí)現(xiàn)我們所寫的程序,在不同電腦上,可進(jìn)行數(shù)據(jù)的傳輸 -
java
是支持網(wǎng)絡(luò)間的數(shù)據(jù)傳輸?shù)?降低層細(xì)節(jié)封裝起來了,給程序員提供了一套標(biāo)準(zhǔn)的類庫很方便使用java語言開發(fā)可以進(jìn)行網(wǎng)絡(luò)通信的軟件 -
網(wǎng)絡(luò)編程的核心問題
-
? 如何找到網(wǎng)絡(luò)世界中的惡目標(biāo)主機(jī),以及目標(biāo)軟件
-
? 在終端 使用 ipconfig 指令查看ip
-
? 如何安全可靠的進(jìn)行數(shù)據(jù)傳輸 協(xié)議 規(guī)則
-
網(wǎng)絡(luò)的一些基本知識(shí)
- 網(wǎng)絡(luò)模型
- ? OSI參考模型 是一個(gè)理想化的標(biāo)準(zhǔn)模型
- ? 分成七層
- ? TCP/IP參考模型
- ? 分成四層
- ? 應(yīng)用層(http)
- ? 運(yùn)輸層(協(xié)議)
- ? 網(wǎng)絡(luò)層(ip)
- ? 物理鏈路層(硬件設(shè)備)
如下:
-
通信要素 ip 端口 協(xié)議
-
IP
:在網(wǎng)絡(luò)世界中,是計(jì)算機(jī)的地址 - ?
局域網(wǎng)地址
:192.168.1.20
連接到路由器,會(huì)自動(dòng)分配IP
- ?
廣域網(wǎng)地址
: 家里的寬帶 與外界連接 - ?
本機(jī)地址
: 本地回環(huán)地址127.0.0.1
-
端口
:計(jì)算機(jī)中運(yùn)行中的程序的編號(hào),對應(yīng)的是程序- 端口號(hào)0-65535之間 由于0-1024被一些系統(tǒng)程序使用,所以我們開發(fā)的程序可以從
1024-655335區(qū)設(shè)定端口,但是不能與已有的發(fā)生沖突
- 端口號(hào)0-65535之間 由于0-1024被一些系統(tǒng)程序使用,所以我們開發(fā)的程序可以從
-
ip+端口
找到目標(biāo)計(jì)算機(jī) 以及你想要的程序
-
如何進(jìn)行安全信息傳輸–傳輸協(xié)議
-
Java中分為兩種編程協(xié)議
- TCP
- UDP
TCP協(xié)議通信原理
先檢測網(wǎng)絡(luò)是否通暢,客戶端是否能連接到服務(wù)器端
如果能連接到,則進(jìn)行數(shù)據(jù)的傳輸,如果連接不到,就會(huì)報(bào)錯(cuò)
采用3次握手的機(jī)制 (連接請求)
1.第一次客戶端給服務(wù)器發(fā)送一個(gè)信息
2.服務(wù)器收到客戶端的請求后,需要給客戶端做出一個(gè)反饋(表示服務(wù)器端收到客戶端消息)
3.客戶端收到服務(wù)器端確認(rèn)反饋后,再一次向服務(wù)器發(fā)送一個(gè)反饋,以確保服務(wù)器知道他的
反饋,客戶端是收到 (表示客戶端成功收到服務(wù)器端消息)
? TCP是可靠的安全的,相對于UDP效率低
四次揮手(端來請求)
- 1.客戶端 向服務(wù)器端發(fā)送一個(gè)斷開請求
- 2.服務(wù)器端 向客服發(fā)出一個(gè)反饋
- 3.服務(wù)器端把沒有發(fā)完的數(shù)據(jù)全部發(fā)送
- 4.客戶端再向服務(wù)器端發(fā)送最終斷開的信號(hào)
UDP協(xié)議通信原理
- ? 將數(shù)據(jù)分裝成一個(gè)一個(gè)數(shù)據(jù)報(bào)
- ? 包含 數(shù)據(jù) 源(自己電腦ip) 目標(biāo)(接受ip 端口)
- ? 只管發(fā)送 是否成功,不知道
- ? 是不安全的,但是效率高
? 不用建立連接,直接發(fā)送
TCP編程
服務(wù)端
ServerSocket
常用的方法
-
Socket accept() throws IOException
- 等待客戶端的連接請求,返回與該客戶端進(jìn)行通信的Socket對象
-
void close() throws IOException
- 關(guān)閉監(jiān)聽Socket
package day15;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/*
服務(wù)器端
*/
public class Server {
public static void main(String[] args) {
//創(chuàng)建并啟動(dòng)服務(wù)器
try{
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服務(wù)器啟動(dòng)成功");
while(true) {
Socket socket = serverSocket.accept();//監(jiān)聽有沒有客戶端連接到服務(wù)器,監(jiān)聽時(shí),會(huì)阻塞程序
System.out.println("有傻逼端連接到服務(wù)器");
//接收客戶端發(fā)送的數(shù)據(jù)
InputStream inputStream = socket.getInputStream();
//下面過于復(fù)雜,可以調(diào)用DataInputStream 但是必須對應(yīng)DataOutputStream
// byte[] bytes = new byte[100];
// int size = inputStream.read(bytes);
// String s = new String(bytes, 0, size);
// System.out.println(s);
DataInputStream dataInputStream = new DataInputStream(inputStream);
String s= dataInputStream.readUTF();
System.out.println(s);
//服務(wù)器向客戶端發(fā)送消息
OutputStream outputStream =socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF("已經(jīng)收到");
// 確保數(shù)據(jù)被發(fā)送出去,并釋放資源
dataOutputStream.flush();
dataOutputStream.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("服務(wù)器啟動(dòng)失敗,端口被占用");
}
}
}
客戶端
常用方法
-
void close() throws IOException
- 關(guān)閉Socket 不可以在以后得網(wǎng)絡(luò)連接中使用 除非創(chuàng)建新的套接字
-
InputStream getInputStream() throws IOException
- 獲取與Socket相關(guān)聯(lián)的字節(jié)輸入流,用于從Socket中讀入數(shù)據(jù)
-
OutputStream getOutputStream() throws IOException
- 獲取與Socket相關(guān)聯(lián)的字節(jié)輸出流 ,用于向Socket中寫入數(shù)據(jù)
package day15;
import java.io.*;
import java.net.Socket;
/*
客戶端
*/
public class Client {
public static void main(String[] args) {
//創(chuàng)建客戶端
//127.0.0.1自己地址
try {
//向服務(wù)器發(fā)送
Socket socket = new Socket("127.0.0.1", 9999);
//在客戶端向服務(wù)器端發(fā)送一句話
OutputStream outputStream = socket.getOutputStream();//獲取輸出流
DataOutputStream dataOutputStream =new DataOutputStream(outputStream);
String s = "你好";
dataOutputStream.writeUTF(s);
//接受服務(wù)器
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
System.out.println(dataInputStream.readUTF());
} catch (IOException e) {
e.printStackTrace();
System.out.println("連接服務(wù)器失敗");
}
}
}
UDP編程
服務(wù)端
package day16;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDPReceive {
public static void main(String[] args) {
try {
while(true){
//接受數(shù)據(jù)的對象
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] bytes = new byte[100];
//接受數(shù)據(jù)包
DatagramPacket datagramPacket = new DatagramPacket(bytes,0, bytes.length);
datagramSocket.receive(datagramPacket);
String s = new String(bytes,0,datagramPacket.getLength());
System.out.println(s);
datagramSocket.close();
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客戶端
package day16;
import java.io.IOException;
import java.net.*;
//發(fā)送端
public class UDPSendDemo {
public static void main(String[] args) {
try {
DatagramSocket datagramSocket = new DatagramSocket();//負(fù)責(zé)發(fā)送數(shù)據(jù)報(bào)
byte[] bytes = "你好sb鄧欽文".getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes,0, bytes.length, InetAddress.getByName("127.0.0.1"),9999);
//發(fā)送(datagramSocket方法)
datagramSocket.send(datagramPacket);
datagramSocket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP 與 UDP的區(qū)別
TCP
(傳輸控制協(xié)議)和UDP
(用戶數(shù)據(jù)報(bào)協(xié)議)都是網(wǎng)絡(luò)傳輸層協(xié)議,用于在網(wǎng)絡(luò)中傳輸數(shù)據(jù)。它們之間的主要區(qū)別在于連接方式
、可靠性
、數(shù)據(jù)流方式
和功能
。文章來源:http://www.zghlxwxcb.cn/news/detail-794393.html
-
連接方式:
-
TCP
是面向連接的協(xié)議,發(fā)送方和接收方在發(fā)送數(shù)據(jù)之前,必須通過三次握手建立連接。這個(gè)過程確保了雙方都已準(zhǔn)備好進(jìn)行數(shù)據(jù)傳輸。 -
UDP
是無連接的協(xié)議,發(fā)送方在向接收方發(fā)送數(shù)據(jù)時(shí)不需要建立連接。這意味著UDP
可以更快地發(fā)送數(shù)據(jù),但也可能導(dǎo)致數(shù)據(jù)的丟失或亂序。
-
-
可靠性:
-
TCP
通過序號(hào)機(jī)制、確認(rèn)機(jī)制、超時(shí)重傳機(jī)制和數(shù)據(jù)校驗(yàn)來保證傳輸?shù)目煽啃?。如果?shù)據(jù)在傳輸過程中丟失或損壞,TCP
會(huì)重新發(fā)送數(shù)據(jù),直到接收方成功接收為止。 -
UDP
只添加了端口和差錯(cuò)檢查的功能,不提供數(shù)據(jù)的可靠性保證。因此,UDP
在傳輸過程中可能會(huì)出現(xiàn)數(shù)據(jù)丟失或亂序的情況。
-
-
數(shù)據(jù)流方式:
-
TCP
是面向字節(jié)流的協(xié)議,將應(yīng)用層傳遞下來的數(shù)據(jù)當(dāng)做無結(jié)構(gòu)的數(shù)據(jù)流進(jìn)行處理。TCP
不知道所傳數(shù)據(jù)的具體含義,只是將數(shù)據(jù)塊拼接成一個(gè)段進(jìn)行發(fā)送。 -
UDP
是面向報(bào)文的協(xié)議,發(fā)送方的UDP
對應(yīng)用程序交下來的報(bào)文添加首部后直接向下交付IP層。每個(gè)報(bào)文都是獨(dú)立發(fā)送的,不需要進(jìn)行拼接。
-
-
功能:
-
TCP
支持單播、多播和廣播的功能,可以實(shí)現(xiàn)一對一、一對多、多對多和多對一的數(shù)據(jù)傳輸。 -
UDP
同樣支持這些傳輸方式,但由于其無連接的特性,使得UDP在實(shí)時(shí)性要求較高的場景中更為適用,如視頻流、音頻流等。
-
文章來源地址http://www.zghlxwxcb.cn/news/detail-794393.html
到了這里,關(guān)于Java網(wǎng)絡(luò)編程 *TCP與UDP協(xié)議*的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!