一、網絡編程簡介
1、概念
網絡編程指在網絡通信協議下,不同計算機上運行的程序,進行數據傳輸
2、軟件架構
(1)CS架構(客戶端和服務端)
在用戶本地有一個客戶端程序,在遠程有一個服務器端程序
(2)BS架構(瀏覽器和服務端)
只需要瀏覽器,用戶通過不同的網址,客戶訪問不同的服務器端程序
微信小程序屬于BS架構
二、網絡編程三要素
1、IP
(1)簡介
Internet Protocol,是互聯網協議地址,也稱IP地址
上網設備在網絡中的地址,是唯一的
是設備在網絡中的唯一標識
有 IPv4 和 IPv6
域名通過 DNS 服務器解析為 IP
(2)IPv4 的地址分類形式
公網地址(萬維網使用) 和私有地址(局域網使用)
192.168. 開頭的就是私有地址,范圍即為192.168.0.0~192.168.255.255
專門為組織機構內部使用,以此節省IP
(3)特殊 IP 地址
127.0.0.1,也可以是localhost,是回送地址,也稱本地回環地址,也稱本機IP,永遠只會尋找當前所在本機
(4)常用CMD命令
ipconfig:查看本機IP地址
ping:檢查網絡是否連通
(5)INetAddress 類
static?InetAddress?getByName?(String?host) | 主機名稱可以是機器名稱,也可以是IP地址 |
String?getHostName?() | 獲取此?IP?地址的主機名 |
String?getHostAddress?() |
2、端口
應用程序在設備中唯一的標識
端口號:由兩個字節表示的整數,取值范圍:0~65535
其中0~1023之間的端口號用于一些知名的網絡服務或者應用
我們自己使用1024及以上的端口號即可
注意:一個端口號只能被一個應用程序使用
3、協議
計算機網絡中,連接和通信的規則被稱為網絡通信協議
常見的協議有UDP、TCP、http、https、ftp等
三、UDP 協議
1、特點
UDP是面向無連接通信協議(沒有接收端也能發送)
速度快,有大小限制(一次最多發送64K),數據不安全,易丟失數據
2、收發數據步驟及示例
public class Send {public static void main(String[] args) throws Exception {// 1、創建DatagramSocket對象DatagramSocket socket = new DatagramSocket(8888);// 如果不指定端口,則隨機指定一個// 2、創建DatagramPacket對象String message = "Hello World!";byte[] content = message.getBytes();DatagramPacket packet = new DatagramPacket(content,content.length,InetAddress.getByName("127.0.0.1"),9999);// 3、發送信息socket.send(packet);// 4、釋放資源socket.close();}
}public class Receive {public static void main(String[] args) throws Exception {// 1、創建DatagramSocket對象DatagramSocket socket = new DatagramSocket(9999);// 2、創建DatagramPacket對象byte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, buf.length);// 3、接收數據socket.receive(packet);// 注意:receive方法會阻塞,直到接收到信息后才會往下執行// 接收到的數據在 packet中// 4、解析數據byte[] data = packet.getData();String msg = new String(data, 0, packet.getLength());String ip = packet.getAddress().getHostAddress();System.out.println("from: " + ip);System.out.println("data: " + msg);// 5、釋放資源socket.close();}
四、TCP 協議
1、特點
TCP 協議是面向連接的通信協議(需要服務端響應請求)
速度慢,但沒有大小限制,數據安全
2、收發數據步驟及示例
public class Client {public static void main(String[] args) throws Exception {// 1、創建Socket對象,指定服務端的IP和端口Socket socket = new Socket("127.0.0.1", 8888);// 2、獲取傳輸數據的流對象OutputStream os = socket.getOutputStream();InputStream is = socket.getInputStream();// 3、收發數據os.write("Nice to meet you".getBytes());byte[] data = new byte[1024];int len = is.read(data);String msg = new String(data, 0, len);String ip = socket.getInetAddress().getHostAddress();System.out.println("from: " + ip);System.out.println("data: " + msg);// 4、釋放資源socket.close();}
}public class Server {public static void main(String[] args) throws Exception {// 1、創建ServerSocket對象,指定端口ServerSocket server = new ServerSocket(8888);System.out.println("waiting for client...");// 2、相應客戶端發送的請求Socket socket = server.accept();// 3、獲取傳輸數據的流對象OutputStream os = socket.getOutputStream();InputStream is = socket.getInputStream();// 4、收發數據byte[] data = new byte[1024];int len = is.read(data);String msg = new String(data, 0, len);String ip = socket.getInetAddress().getHostAddress();System.out.println("from: " + ip);System.out.println("data: " + msg);os.write("Nice to meet you too".getBytes());// 5、關流并釋放資源socket.close();server.close();}
}
3、細節補充
(1)三次握手
第一次:客戶端向服務器發送連接請求(SYN包)并等待服務器確認
第二次:服務器向客戶端返回一個響應(SYN包 + ACK包)告訴客戶端收到了請求
第三次:客戶端向服務器再次發送確認信息(ACK包),連接建立
Tips:第三次握手是為了防?失效的連接請求突然傳到服務器(如網絡延遲的重復SYN包)造成單向連接
(4)四次揮手
第一次:客戶端向服務器發送取消連接的請求(FIN包)
第二次:服務器返回一個響應(ACK包)告訴客戶端收到了請求
服務器將最后的數據處理完畢
第三次:服務器向客戶端發送確認取消連接的消息(FIN包)
第四次:客戶端再次發送確認消息(ACK包),連接取消