網絡
什麼是網絡?
概念:由點和線構成,表示多個對象之間互相聯系
計算機網絡:
網際網路:Internet
網際網路:WWW(World Wide Web)
物聯網:IoT(Internet of Things)
網絡模型(了解):
OSI參考模型:
應用層:如http協定,SMTP協定(郵件)...
表示層:将資料格式進行傳話與加密.
會話層:維持通訊
傳輸層:如恢複通訊,資料流重用等事情.UDP,TCP
網絡層:ip,計算機在網際網路的位址
資料鍊路層:對其資料進行格式化的要求
實體層:硬體裝置,如網線,網線接口等
因為OSI過于理想化,所有沒有被實作
TCP/IP模型
應用層
對應OSI模型的應用層,表示層,會話層
對應的協定:HTTP,SMTP,HTTPS
傳輸層
對應OSI模型的傳輸層
對應的協定:TCP,UDP協定
網絡層
對應OSI模型的網絡層
對應的協定:IP
網絡接口層
對應OSI模型的資料鍊路層與實體層
對應協定:以太網協定,ADSL協定等
網絡程式設計需要什麼?
IP
端口号
通訊協定
IP
概念(重點):計算機在網際網路中的位址
IPV4
4個位元組,每個位元組由8位組成.是以每段的值0~255
0000 0000 ~ 1111 1111
192.168.7.151
IPV6
16個位元組,每個位元組8位組成,每段16位,是以每段取值範圍0~65535
檢視目前計算機IP:
步驟:
1.打開dos指令框
2.輸入ipconfig
IP位址的分類:
A類位址:大型網絡,主要服務于國家與政府企業
B類位址:中型網絡,主要服務于大型實驗室等
C類位址:個人網絡,普通人與普通企業用的網絡
特殊IP:(重點)
127.0.0.1表示本機
因為不好記,是以變為了英文localhost
專業名稱:回路位址
相關指令:
ipconfig
作用:檢視目前計算機的ip資訊
ping
作用:嘗試連接配接對方
InetAddress類:
作用:表示計算機在網絡中的位址
package ip;
import java.io.IOException;
import java.net.InetAddress;
public class Test {
public static void main(String[] args) throws IOException {
//擷取本機的網絡位址資訊
// InetAddress ip = InetAddress.getLocalHost();
//通過主機名擷取别人的位址資訊
InetAddress ip = InetAddress.getByName("www.baidu.com");
//通過指定的ip擷取對方的資訊
// InetAddress ip = InetAddress.getByName("36.152.44.96");
System.out.println(ip);
System.out.println(ip.getHostName()); //擷取裝置名稱
System.out.println(ip.getHostAddress()); //擷取ip位址
}
}
運作結果

端口
概念:程式在計算機中的位址
範圍:0~65535
注意:
0~1023:一般被系統占用
1024~49151:注冊端口
49151~65535:動态端口
常見的端口:
MySQL端口号:3306
Tomcat端口号:8080
HTTP協定端口号:80
Oracle端口号:1521
Redis端口号:6379
通訊協定
TCP
中文名:傳輸控制協定
特點:面向連接配接,安全可靠,效率低,基于位元組流進行通訊的,傳輸資料大小無限制
三次握手,四次揮手
第一次握手第一次揮手:用戶端向伺服器發起請求
第二次握手第二次揮手:判斷是否連接配接成功
第三次握手第三次揮手:用戶端上傳資料或伺服器回報資料
第四次揮手:用戶端斷開連接配接
俗稱:打電話
如:去朋友家做客
1.打電話,詢問是否友善
對方接聽電話(一次握手),打完電話後會挂斷電話(一次揮手)
2.去朋友家,敲門
開門(一次握手),朋友倒茶(一次揮手)
3.開始聚會
聊天(一次握手,一次揮手)
4.說拜拜
一次揮手
Java中對應的類:
Socket:用戶端
ServerSocket:伺服器
UDP
中文名:資料包協定
特點:面向無連接配接,不安全,效率高,基于資料包格式進行傳輸,一個資料包最多64kb
俗稱:對講機
如:用對講機通知同僚有小偷
直接對着對講機說有小偷
基于TCP協定的通訊(掌握)
技術
伺服器
建立ServerSocket
等待用戶端連接配接
關閉資源
用戶端
建立用戶端Socket
關閉資源
案例1:
用戶端給伺服器發送一條消息
案例2:
用戶端給伺服器發送一條消息,伺服器接收後回複一條消息,用戶端接收
案例3:
用戶端上傳檔案給伺服器
package tcp01;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 伺服器
* 要求: 接收一次用戶端消息,列印到控制台
* 步驟:
* 1.建立伺服器Socket
* 2.等待用戶端連接配接,擷取用戶端映射
* 3.通過用戶端映射擷取其輸入流
* 4.使用輸入流讀取資料
* 5.列印到控制台
* 6.關閉資源,關閉用戶端映射,關閉伺服器
*/
public class Server {
public static void main(String[] args) throws IOException {
//1.建立伺服器Socket
/**
* 參數:該伺服器端口号
* 注意:該伺服器的ip就是伺服器所在計算機的ip位址
*/
ServerSocket server = new ServerSocket(9999);
System.out.println("伺服器已啟動, 等待用戶端連接配接");
//2.等待用戶端連接配接,擷取用戶端映射
/**
* 傳回值就是用戶端映射
* 注意:該方法會阻塞程式,等待用戶端連接配接
*/
Socket socket = server.accept();
//3.通過用戶端映射擷取其輸入流
InputStream is = socket.getInputStream();
//4.使用輸入流讀取資料
byte[] b = new byte[1024];
int len = 0;
while((len = is.read(b)) != -1) {
String str = new String(b, 0, len);
//5.列印到控制台
System.out.println("用戶端說: " + str);
}
//6.關閉資源,關閉用戶端映射,關閉伺服器
is.close();
socket.close(); //關閉用戶端映射
server.close(); //關閉伺服器
System.out.println("通訊結束, 伺服器關閉");
}
}
package tcp01;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
/**
* 用戶端
* 要求:用戶端給伺服器發送一條消息
* 步驟:
* 1.建立用戶端的Socket
* 2.擷取用戶端的輸出流
* 3.輸出資料
* 4.關閉資源
*/
public class Client {
public static void main(String[] args) throws IOException {
//1.建立用戶端的Socket
/**
* 參數1:伺服器的位址
* 參數2:伺服器的端口号
* 注意:需要先啟動伺服器,再啟動用戶端
*/
Socket socket = new Socket("127.0.0.1", 9999);
//2.擷取用戶端的輸出流
OutputStream os = socket.getOutputStream();
//3.輸出資料
os.write("你好!".getBytes());
os.flush();
//4.關閉資源
os.close();
socket.close();
}
}
運作結果
package tcp02;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 伺服器
* 步驟:
* 1.建立伺服器Socket
* 2.等待用戶端連接配接,擷取用戶端映射
* 3.接收用戶端消息
* 1.擷取用戶端映射的輸入流
* 2.通過輸入流擷取資訊
* 4.發送消息給用戶端
* 1.擷取用戶端映射的輸出流
* 2.通過輸出流回複消息
* 5.關閉資源
*/
public class Server {
public static void main(String[] args) throws IOException {
//1.建立伺服器Socket
ServerSocket serverSocket = new ServerSocket(8989);
//2.等待用戶端連接配接, 擷取用戶端映射
Socket socket = serverSocket.accept();
//3.接收用戶端消息
InputStream is = socket.getInputStream();
byte[] b = new byte[1024];
int len = is.read(b);
String str = new String(b, 0, len);
System.out.println("用戶端說: " + str);
//4.發送消息給用戶端
OutputStream os = socket.getOutputStream();
os.write("收到".getBytes());
os.flush();
//5.關閉資源
os.close();
is.close();
socket.close();
serverSocket.close();
}
}
package tcp02;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* 用戶端
* 步驟:
* 1.建立用戶端Socket
* 2.發送消息給伺服器
* 擷取輸出流
* 使用輸出流發送消息
* 3.接收伺服器回報的消息
* 擷取輸入流
* 使用輸入流接收消息
* 4.關閉資源
*/
public class Client {
public static void main(String[] args) throws IOException {
//1.建立用戶端Socket
Socket socket = new Socket("127.0.0.1", 8989);
//2.發送消息給伺服器
OutputStream os = socket.getOutputStream();
os.write("伺服器你好, 我是用戶端".getBytes());
os.flush();
//3.接收伺服器回報的消息
InputStream is = socket.getInputStream();
byte[] b = new byte[1024];
int len = is.read(b);
String str = new String(b, 0, len);
System.out.println("伺服器說: " + str);
//4.關閉資源
is.close();
os.close();
socket.close();
}
}
運作結果
package tcp03;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
/**
* 伺服器
* 要求:用戶端上傳圖檔給伺服器
* 步驟:
* 1.建立伺服器Socket
* 2.等待用戶端連接配接
* 3.接收用戶端上傳的檔案,并儲存
* 4.傳回消息給伺服器,表示說收到了
* 5.關閉資源
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(7979);
System.out.println("伺服器已啟動");
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
//生成檔案名稱, 使用工具類UUID
String name = UUID.randomUUID().toString().replace("-", "");
String file = name + ".png";
//建立檔案流存儲上傳的檔案
FileOutputStream fos = new FileOutputStream(file);
byte[] b = new byte[1024];
int len = 0;
//用戶端輸出流斷開後,讀取的長度才可以等于-1
while((len = is.read(b)) != -1) {
fos.write(b, 0, len);
fos.flush();
}
fos.close();
System.out.println("用戶端上傳結束");
OutputStream os = socket.getOutputStream();
os.write("上傳成功".getBytes());
os.flush();
os.close();
is.close();
socket.close();
serverSocket.close();
}
}
package tcp03;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
/**
* 用戶端
* 要求:上傳一個檔案給伺服器,接收伺服器回報的消息
* 步驟:
* 1.建立用戶端Socket
* 2.上傳檔案
* 3.接收伺服器消息
* 4.關閉資源
*/
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 7979);
OutputStream os = socket.getOutputStream();
FileInputStream fis = new FileInputStream("D:\\query.png");
byte[] b = new byte[1024];
int len = 0;
while((len = fis.read(b)) != -1) {
os.write(b, 0, len);
os.flush();
}
//結束用戶端輸出流
socket.shutdownOutput();
System.out.println("檔案上傳結束");
//讀取伺服器回報的消息
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String str = br.readLine();
System.out.println("伺服器說: " + str);
br.close();
fis.close();
os.close();
socket.close();
}
}
運作結果
基于UDP協定的通訊(了解)
技術:
接收端
DatagramSocket(端口号)
接收端對象.receive(資料包):接收資料
發送端
DatagramSocket()
發送端對象.send(資料包):用于發送資料包
資料包
DatagramPacket
案例:
發送端發送一條消息給接收端
package udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 接收端
* 步驟:
* 1.建立接收端Socket
* 2.建立一個空的資料包,準備接收資料
* 3.接收資料
* 4.關閉資源
*/
public class Receive {
public static void main(String[] args) throws IOException {
//1.建立接收端Socket
DatagramSocket rSocket = new DatagramSocket(10101);
//2.建立一個空的資料包,準備接收資料
byte[] b = new byte[1024];
DatagramPacket packet = new DatagramPacket(b, b.length);
//3.接收資料
rSocket.receive(packet);
//擷取包中的資料列印輸出
byte[] data = packet.getData(); //擷取包中的資料
int length = packet.getLength(); //擷取包中的資料長度
String str = new String(data, 0, length);
System.out.println("接收的資料: " + str);
//4.關閉資源
rSocket.close();
}
}
package udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 發送端
* 步驟:
* 1.建立發送端的Socket
* 2.準備要發送的資料包
* 3.發送資料
* 4.關閉資源
*/
public class Send {
public static void main(String[] args) throws IOException {
//1.建立發送端的Socket
DatagramSocket sSocket = new DatagramSocket();
//2.準備要發送的資料包
byte[] b = "接收端你好, 我是發送端".getBytes();
//接收端ip
InetAddress address = InetAddress.getByName("127.0.0.1");
/**
* 準備要發送的資料包
* 1參:要發送資料所在的數組
* 2參:開始位置
* 3參:發送的位元組長度
* 4參:接收端位址
* 5參:接收端端口号
*/
DatagramPacket packet = new DatagramPacket(b, 0, b.length, address, 10101);
//3.發送資料
sSocket.send(packet);
//4.關閉資源
sSocket.close();
}
}
運作結果
練習
使用TCP完成用戶端與伺服器的多次對話
package tcp04;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9876);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String str;
Scanner scanner = new Scanner(System.in);
while((str = br.readLine()) != null) {
System.out.println("用戶端說: " + str);
System.out.println("請輸入你要回複的内容: ");
String input = scanner.nextLine();
os.write((input + "\n").getBytes());
os.flush();
}
br.close();
os.close();
socket.close();
serverSocket.close();
}
}
package tcp04;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 9876);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
os.write("Hello\n".getBytes());
os.flush();
String str;
Scanner scanner = new Scanner(System.in);
while((str = br.readLine()) != null) {
System.out.println("伺服器說: " + str);
System.out.println("請輸入你要回複的内容: ");
String input = scanner.nextLine();
os.write((input + "\n").getBytes());
os.flush();
}
br.close();
os.close();
socket.close();
}
}
運作結果