1. 什么是網絡編程【理解】
-
1.1 概念
- 在網絡通信協議下,不同計算機上運行的程序,進行的數據傳輸。
- 應用場景:
- 即時通信、網游對戰、金融證券、國際貿易、郵件、等等。
- 不管是什么場景,都是計算機跟計算機之間通過網絡進行數據傳輸
- Java中可以使用java.net包下的技術輕松開發出常見的網絡應用程序
1.2 常見的軟件架構
-
1.21 C/S
- C/S全稱:Client/Server(客戶端/服務器)
- 采取該架構的軟件,需要在用戶本地需要下載并安裝客戶端程序,在遠程有一個服務器端程序[例如:QQ,Steam]
-
1.22 B/S
- B/S全稱:Browser/Server (瀏覽器/服務器)
- 采取該架構的軟件,只需要一個瀏覽器,用戶通過不同的網址。客戶訪問不同的服務器[例如:京東,淘寶]
-
1.23 C/S,B/S的選擇(優缺點)
- 總結:CS適合專業化的辦公軟件,BS適合移動互聯網應用
- C/S
- 優點
- 畫面可以做的非常精美,用戶體驗好
- 缺點
- 用戶需要下載和更新的時候比較麻煩
- 需要開發客戶端,也需要開發服務端
- 優點
- B/S
- 所有的通過服務器訪問的其實都是bs架構,如網頁游戲,購物商城? ?。
- 優點[方便]
- 不需要開發客戶端,只需要頁面+服務端
- 用戶不需要下載,打開瀏覽器就能用
- 缺點
- 如果應用過大,用戶體驗受到影響
2. 網絡編程三要素【理解】
-
2.1 三要素簡單概況
-
IP地址
-
設備在網絡中的地址,是唯一的標識
-
-
端口
-
應用程序在設備中唯一的標識
-
-
協議
-
數據在網絡中傳輸的規則,常見的協議由UDP、TCP、http、https、ftp。
-
-
-
2.2 IP
-
2.21 概念
- 全稱:Internet Protocol,是互聯網協議地址,也稱IP地址。是分配給上網設備的數字標簽。
- 通俗理解:上網設備在網絡中的地址,是唯一的。
-
2.22 常見的IP分類??????
- IP地址分為兩大類
- IPv4:全稱Internet Protocol version 4,互聯網通信協議第四版
- 采用32位地址長度,分為4組
- 例如一個采用二進制形式的IP地址是“11000000 10101000 00000001 01000010”
- 為了方便使用,IP地址經常被寫成十進制的形式,中間使用符號“.”分隔不同的字節。于是,上面的IP地址可以表示為“192.168.1.66”。IP地址的這種表示法叫做“點分十進制表示法”,這顯然比1和0容易記憶得多
- 缺點:ip地址不夠用,僅有不到43億,于是誕生了IPv6
- 采用32位地址長度,分為4組
- IPv6【了解】:全稱Internet Protocal version 6,互聯網通信協議第六版。
- 采用128位地址長度,分成8組
- 這里就不舉例子了,可以參考IPv4的IP地址,不過為8組,也因此有2的128次方的ip地址
- 為了方便使用,IPv6使用冒分十六進制表示法,將上面每一組轉為十六進制,并用冒號分隔。如2001:0DB8:0000:0023:0008:0800:200C:417A,因為比較長的原因,故把每一組前面的零進行省略,記錄成2001:DB8:0:23:8:800:200C:417A
- 特殊情況:如果計算出的16進制里面有很多連續的0,可以使用0位壓縮表示法,如FF01:0:0:0:0:0:0:1101可以轉為FF01::1101
- IPv4:全稱Internet Protocol version 4,互聯網通信協議第四版
- IP地址分為兩大類
-
2.23 IPv4的地址分類形式
- 主要分為公網地址(萬維網使用) 和 私有地址(局域網使用)
- 私有地址
- 192.168.開頭的就是私有地址,范圍即為192.168.0.0--192.168.255.255,專門為組織機構內部使用,以此節省IP
- 特殊IP地址
- 127.0.0.1,也可以是localhost:是回送地址,也稱本地回環地址,也稱本機IP,永遠只會尋找當前所在本機。
- 常見的CMD命令
- ipconfig:查看本機IP地址
- ping:檢查網絡是否連通
-
2.24 InetAddress的使用
- 概況:此類表示Internet協議(IP)地址
-
相關方法
方法名 說明 static InetAddress getByName(String host) 確定主機名稱的IP地址。主機名稱可以是機器名稱,也可以是IP地址 String getHostName() 獲取此IP地址的主機名 String getHostAddress() 返回文本顯示中的IP地址字符串
-
public class MyInetAddress {public static void main(String[] args) throws UnknownHostException {//IP的對象,看作為電腦的對象InetAddress address = InetAddress.getByName("LAPTOP-BPH5T8C9");InetAddress address1 = InetAddress.getByName("127.0.0.1");System.out.println(address);System.out.println(address1);String name = address.getHostAddress();System.out.println(name);String ip=address.getHostAddress();System.out.println(ip);}
}
-
2.3 端口號
- 概念:應用程序在設備中唯一的標識
- 端口號:
- 由兩個字節表示的整數,取值范圍:0~65535
- 其中0~1023之間的端口號用于一些知名的網絡服務或者應用
- 我們使用1024以上的端口號就可以了。
- 注意:一個端口號只能被一個應用程序使用
-
2.4 協議
-
2.41 主要概念:
- 計算機網絡中,連接和通信的規則被稱為網絡通信協議
- OSI參考模型:世界互聯協議標準,全球通信規范,單模型過于理想化,未能在因特網上進行廣泛推廣
- TCP/IP參考模型(或TCP/IP協議):事實上的國際標準
- 我們本次主要學習UDP協議和TCP協議
-
2.42 UDP與TCP協議的簡單概括
- UDP協議
- UDP是面向無連接通信協議
- 特點
- 用戶數據報協議
- 速度快,有大小限制,一次最多發送64K,數據不安全,易丟失數據
- 應用場景
- 網絡會議
- 語音通話
- 在線視頻
- TCP協議
- TCP是面向連接的通信協議
- 特點
- 速度慢
- 沒有大小限制
- 數據安全
- 應用場景
- 下載軟件
- 文字聊天
- 發送郵件
- UDP協議
-
3. UDP通信程序
-
3.1 UDP通信程序步驟(發送數據)
-
發送數據的步驟(右邊是將其理解為寄東西的理解)
-
創建發送端的Socket對象(DatagramSocket)? ? ? ? ? ? ? ? ? ? ? ? 找快遞公司
-
創建數據,并把數據打包? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 打包禮物
-
調用DatagramSocket對象的方法發送數據? ? ? ? ? ? ? ? ? ? ? ? ? ?快遞公司發送包裹?
-
關閉發送端? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?付錢走人
-
-
-
3.2 UDP發送方法
-
構造方法
方法名 說明 DatagramSocket() 創建數據報套接字并將其綁定到本機地址上的任何可用端口 DatagramPacket(byte[] buf,int len,InetAddress add,int port) 創建數據包,發送長度為len的數據包到指定主機的指定端口 -
相關方法
方法名 說明 void send(DatagramPacket p) 發送數據報包 void close() 關閉數據報套接字 void receive(DatagramPacket p) 從此套接字接受數據報包
? ? ? ? ? ? ? ?
public static void main(String[] args) throws IOException {//創建DatagramSocket對象DatagramSocket ds= new DatagramSocket();//打包數據String str="數據傳輸中ing";byte[] bytes=str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port=10086;DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);//發送數據ds.send(dp);//釋放資源ds.close();}
- 細節:
- 綁定端口,我們以后就是通過這個端口往外發送
- 空參:所有可用的端口隨機一個進行使用
- 有參:指定端口號進行綁定
-
3.3 UDP通信程序步驟(接收數據)
- 接收數據的步驟(右邊是將其理解為收東西的理解)
- 創建接收端的DatagramSocket對象? ? ? ? ? ? ? ? 找快遞公司
- 接受打包好的數據? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?接收箱子
- 解析數據包? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 從箱子里面獲取禮物
- 釋放資源? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 簽收走人
- 接收數據的步驟(右邊是將其理解為收東西的理解)
-
3.4 UDP接收方法
-
構造方法
方法名 說明 DatagramPacket(byte[] buf, int len) 創建一個DatagramPacket用于接收長度為len的數據包 -
相關方法
方法名 說明 byte[] getData() 返回數據緩沖區 int getLength() 返回要發送的數據的長度或接收的數據的長度
public static void main(String[] args) throws IOException {//細節://在接收的時候,一定要綁定端口//而且綁定的端口一定要跟發送的端口保持一致//創建DatagramSocket對象DatagramSocket ds=new DatagramSocket(10086);//接收數據包byte[] bytes=new byte[1024];DatagramPacket dp=new DatagramPacket(bytes,bytes.length);ds.receive(dp);//解析數據被byte[] data=dp.getData();int len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到數據"+new String(data,0,len));System.out.println("該數據是從"+address+"這臺電腦中的"+port+"這個端口發出的");//釋放資源ds.close();}
- 細節:
- 綁定端口,我們以后就是通過這個端口往外發送
- 空參:所有可用的端口隨機一個進行使用
- 有參:指定端口號進行綁定
- receive方法是堵塞的,會一直等發送端發送信息
3.5 UDP的三種通信方式
- 單播:一對一個,一個電腦作為發送端,只給一臺電腦發送數據
- 上述的代碼就是單播
- 組播:一對一組,一個電腦作為發送端,可給一組電腦發送數據
- 組播地址:224.0.0.0~239.255.255.255
- 其中224.0.0.0~224.0.0.255 為預留的組播地址
- 組播地址:224.0.0.0~239.255.255.255
- 廣播:一對一群,一個電腦作為發送端,可以給局域網中所有電腦發送數據
- 廣播地址:255.255.255.255
// 發送端
public class ClinetDemo {public static void main(String[] args) throws IOException {// 1. 創建發送端的Socket對象(DatagramSocket)DatagramSocket ds = new DatagramSocket();String s = "hello 組播";byte[] bytes = s.getBytes();InetAddress address = InetAddress.getByName("224.0.1.0");int port = 10000;// 2. 創建數據,并把數據打包(DatagramPacket)DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);// 3. 調用DatagramSocket對象的方法發送數據(在單播中,這里是發給指定IP的電腦但是在組播當中,這里是發給組播地址)ds.send(dp);// 4. 釋放資源ds.close();}
}
// 接收端
public class ServerDemo {public static void main(String[] args) throws IOException {// 1. 創建接收端Socket對象(MulticastSocket)MulticastSocket ms = new MulticastSocket(10000);// 2. 創建一個箱子,用于接收數據DatagramPacket dp = new DatagramPacket(new byte[1024],1024);// 3. 把當前計算機綁定一個組播地址,表示添加到這一組中.ms.joinGroup(InetAddress.getByName("224.0.1.0"));// 4. 將數據接收到箱子中ms.receive(dp);// 5. 解析數據包,并打印數據byte[] data = dp.getData();int length = dp.getLength();System.out.println(new String(data,0,length));// 6. 釋放資源ms.close();}
}
運行效果