什么是網(wǎng)絡(luò)編程
- 在網(wǎng)絡(luò)通信協(xié)議下, 不同計算機(jī)上運(yùn)行的程序, 通過網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸
- 簡單來說就是計算機(jī)與計算機(jī)之間通過網(wǎng)絡(luò)傳輸數(shù)據(jù)
常見的架構(gòu)
BS架構(gòu)和CS架構(gòu)

常見的軟件架構(gòu)
優(yōu)缺點對比

BS/CS架構(gòu)對比
網(wǎng)絡(luò)編程三要素
- IP: 設(shè)備在網(wǎng)絡(luò)中的地址, 是唯一的標(biāo)識
- 端口號: 應(yīng)用程序在設(shè)備中唯一的標(biāo)識
- 協(xié)議: 數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸規(guī)則, 常見的協(xié)議有UDP, TCP, http, https, ftp
UDP協(xié)議:
- 用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol)
- UDP是面向無連接通信協(xié)議(不關(guān)心兩設(shè)備間網(wǎng)絡(luò)是否暢通)
速度快, 有大小限制一次最多發(fā)送64K, 數(shù)據(jù)不安全, 易丟失數(shù)據(jù)
TCP協(xié)議
- 傳輸控制協(xié)議TCP(Transmission Control Protocol)
- TCP協(xié)議是面向連接的通信協(xié)議
速度慢, 沒有大小限制, 數(shù)據(jù)安全
UDP通信程序(發(fā)送數(shù)據(jù))
- 創(chuàng)建發(fā)送端的DatagramSocket對象
- 數(shù)據(jù)打包(DatagramPacket)
- 發(fā)送數(shù)據(jù)
- 釋放資源
//創(chuàng)建發(fā)送端對象
//可以空參也可以帶參
//空參則隨機(jī)一個端口進(jìn)行發(fā)送
//帶參則指定端口發(fā)送
DatagramSocket ds = new DatagramSocket();
//打包數(shù)據(jù)
String str = "云想衣裳花想容";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");//發(fā)送到本機(jī)
int port = 10086;//發(fā)送到10086端口
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
//發(fā)送數(shù)據(jù)
ds.send(dp);
//釋放資源
ds.close();
UDP通信程序(接收數(shù)據(jù))
- 創(chuàng)建接收端的DatagramSocket對象
- 接收打包好的數(shù)據(jù)
- 解析數(shù)據(jù)包
- 釋放資源
//創(chuàng)建接收端對象
//接收端口必須帶參, 之前是發(fā)送到哪個端口, 接收時就要傳遞哪個端口
DatagramSocket ds = new DatagramSocket(10086);
//接收數(shù)據(jù)包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
ds.receive(dp);
//解析數(shù)據(jù)
InetAddress address = dp.getAddress();
byte[] data = dp.getData();
int length = dp.getLength();
int port = dp.getPort();
System.out.println("接收到數(shù)據(jù)" + new String(data,0,length));//接收到數(shù)據(jù)云想衣裳花想容
System.out.println("是從設(shè)備" + address + "的" + port +"端口發(fā)送的");//是從設(shè)備/127.0.0.1的54784端口發(fā)送的
//釋放資源
ds.close();
TCP通信程序
-
TCP通信協(xié)議是一種可靠的網(wǎng)絡(luò)協(xié)議, 它在通信的兩端各建立一個Socket對象, 通信之前要保證連接已經(jīng)建立, 通過Socket產(chǎn)生lO流來進(jìn)行網(wǎng)絡(luò)通信
客戶端(Socket)
- 創(chuàng)建客戶端Socket對象, 與指定服務(wù)端連接
- 獲取輸出流, 寫數(shù)據(jù)
- 釋放資源
//創(chuàng)建客戶端對象
//發(fā)送到本機(jī)的10000端口
//在創(chuàng)建對象的同時會連接服務(wù)端, 如果連接不上, 代碼會報錯
Socket socket = new Socket("127.0.0.1",10000);
//使用客戶端對象獲取輸出流
OutputStream os = socket.getOutputStream();
os.write("霓為衣兮風(fēng)為馬".getBytes());
//釋放資源
os.close();
socket.close();
服務(wù)器(SeverSocket)
- 創(chuàng)建服務(wù)器端Socket對象(SeverSocket)
- 監(jiān)聽客戶端連接, 返回一個Socket對象
- 獲取輸入流, 讀數(shù)據(jù), 并把數(shù)據(jù)顯示在控制臺上
- 釋放資源
//創(chuàng)建服務(wù)器對象
//參數(shù)的端口要與客戶端中發(fā)送到的端口保持一致
ServerSocket ss = new ServerSocket(10000);
//監(jiān)聽客戶端的連接
//如果連接成功, accept方法會返回Socket的對象
Socket socket = ss.accept();
//從連接通道中, 獲取輸入流來讀取數(shù)據(jù)
InputStream is = socket.getInputStream();
//字節(jié)流不能讀中文, 所以使用轉(zhuǎn)換流將其轉(zhuǎn)換成字符流
InputStreamReader isr = new InputStreamReader(is);
int b;
while ((b = isr.read()) != -1) {
System.out.print((char) b);//霓為衣兮風(fēng)為馬
}
//釋放資源
isr.close();
socket.close();
ss.close();
TCP通信程序三次握手協(xié)議

三次握手
TCP通信程序四次揮手協(xié)議

四次揮手
