1. 網(wǎng)絡(luò)編程
Java是 Internet 上的語言,它從語言級上提供了對網(wǎng)絡(luò)應(yīng)用程序的支持,程序員能夠很容易開發(fā)常見的網(wǎng)絡(luò)應(yīng)用程序。
Java提供的網(wǎng)絡(luò)類庫,可以實現(xiàn)無痛的網(wǎng)絡(luò)連接,聯(lián)網(wǎng)的底層細(xì)節(jié)被隱藏在 Java 的本機(jī)安裝系統(tǒng)里,由 JVM 進(jìn)行控制。并且 Java 實現(xiàn)了一個跨平臺的網(wǎng)絡(luò)庫,程序員面對的是一個統(tǒng)一的網(wǎng)絡(luò)編程環(huán)境
。
1.1 軟件架構(gòu)
-
C/S架構(gòu) :全稱為
Client/Server
結(jié)構(gòu),是指客戶端和服務(wù)器結(jié)構(gòu)。常見程序有QQ、美團(tuán)app、360安全衛(wèi)士等軟件。
B/S架構(gòu) :全稱為Browser/Server
結(jié)構(gòu),是指瀏覽器和服務(wù)器結(jié)構(gòu)。常見瀏覽器有IE、谷歌、火狐等。
兩種架構(gòu)各有優(yōu)勢,但是無論哪種架構(gòu),都離不開網(wǎng)絡(luò)的支持。網(wǎng)絡(luò)編程,就是在一定的協(xié)議下,實現(xiàn)兩臺計算機(jī)的通信的程序。
1.2 網(wǎng)絡(luò)基礎(chǔ)
-
計算機(jī)網(wǎng)絡(luò):
把分布在不同地理區(qū)域的計算機(jī)與專門的外部設(shè)備用通信線路互連成一個規(guī)模大、功能強(qiáng)的網(wǎng)絡(luò)系統(tǒng),從而使眾多的計算機(jī)可以方便地互相傳遞信息、共享硬件、軟件、數(shù)據(jù)信息等資源。 -
網(wǎng)絡(luò)編程的目的: 直接或間接地通過網(wǎng)絡(luò)協(xié)議與其它計算機(jī)實現(xiàn)數(shù)據(jù)交換,進(jìn)行通訊。
-
網(wǎng)絡(luò)編程中有三個主要的問題:
- 問題1:如何準(zhǔn)確地定位網(wǎng)絡(luò)上一臺或多臺主機(jī)
- 問題2:如何定位主機(jī)上的特定的應(yīng)用
- 問題3:找到主機(jī)后,如何可靠、高效地進(jìn)行數(shù)據(jù)傳輸
2. 網(wǎng)絡(luò)通信要素
2.1 如何實現(xiàn)網(wǎng)絡(luò)中的主機(jī)互相通信
- 通信雙方地址
- IP
- 端口號
- 一定的規(guī)則:不同的硬件、操作系統(tǒng)之間的通信,所有的這一切都需要一種規(guī)則。而我們就把這種規(guī)則稱為協(xié)議,即網(wǎng)絡(luò)通信協(xié)議。
2.2 通信要素一:IP地址和域名
2.2.1 IP地址
IP地址:指互聯(lián)網(wǎng)協(xié)議地址(Internet Protocol Address),俗稱IP。IP地址用來給網(wǎng)絡(luò)中的一臺計算機(jī)設(shè)備做唯一的編號。假如我們把“個人電腦”比作“一臺電話”的話,那么“IP地址”就相當(dāng)于“電話號碼”。
IP地址分類方式一:
-
IPv4
:是一個32位的二進(jìn)制數(shù),通常被分為4個字節(jié),表示成a.b.c.d
的形式,以點分十進(jìn)制
表示,例如192.168.65.100
。其中a、b、c、d都是0~255之間的十進(jìn)制整數(shù)。
-
這種方式最多可以表示42億個。其中,30億都在北美,亞洲4億,中國2.9億。2011年初已經(jīng)用盡。
-
IP地址 = 網(wǎng)絡(luò)地址 +主機(jī)地址
- 網(wǎng)絡(luò)地址:標(biāo)識計算機(jī)或網(wǎng)絡(luò)設(shè)備所在的網(wǎng)段
- 主機(jī)地址:標(biāo)識特定主機(jī)或網(wǎng)絡(luò)設(shè)備
其中,E類用于科研。
-
IPv6
:由于互聯(lián)網(wǎng)的蓬勃發(fā)展,IP地址的需求量愈來愈大,但是網(wǎng)絡(luò)地址資源有限,使得IP的分配越發(fā)緊張。為了擴(kuò)大地址空間,擬通過IPv6重新定義地址空間,采用128位地址長度,共16個字節(jié),寫成8個無符號整數(shù),每個整數(shù)用四個十六進(jìn)制位表示,數(shù)之間用冒號(:)分開。比如:
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
,按保守方法估算IPv6實際可分配的地址,整個地球的每平方米面積上仍可分配1000多個地址,這樣就解決了網(wǎng)絡(luò)地址資源數(shù)量不夠的問題。2012年6月6日,國際互聯(lián)網(wǎng)協(xié)會舉行了世界IPv6啟動紀(jì)念日,這一天,全球IPv6網(wǎng)絡(luò)正式啟動。多家知名網(wǎng)站,如Google、Facebook和Yahoo等,于當(dāng)天全球標(biāo)準(zhǔn)時間0點(北京時間8點整)開始永久性支持IPv6訪問。2018年6月,三大運(yùn)營商聯(lián)合阿里云宣布,將全面對外提供IPv6服務(wù),并計劃在2025年前助推中國互聯(lián)網(wǎng)真正實現(xiàn)“IPv6 Only”。在IPv6的設(shè)計過程中除了一勞永逸地解決了地址短缺問題以外,還考慮了在IPv4中解決不好的其它問題,主要有端到端IP連接、服務(wù)質(zhì)量(QoS)、安全性、多播、移動性、即插即用等。
IP地址分類方式二:
公網(wǎng)地址( 萬維網(wǎng)使用)和 私有地址( 局域網(wǎng)使用)。192.168.開頭的就是私有地址,范圍即為192.168.0.0–192.168.255.255,專門為組織機(jī)構(gòu)內(nèi)部使用。
常用命令:
- 查看本機(jī)IP地址,在控制臺輸入:
ipconfig
- 檢查網(wǎng)絡(luò)是否連通,在控制臺輸入:
ping 空格 IP地址
ping 192.168.1.222
特殊的IP地址:
-
本地回環(huán)地址(hostAddress):
127.0.0.1
-
主機(jī)名(hostName):
localhost
2.2.2 域名
Internet上的主機(jī)有兩種方式表示地址:
- 域名(hostName):https://www.csdn.net/
- IP 地址(hostAddress):202.108.35.210
域名解析: 因為IP地址數(shù)字不便于記憶,因此出現(xiàn)了域名。域名容易記憶,當(dāng)在連接網(wǎng)絡(luò)時輸入一個主機(jī)的域名后,域名服務(wù)器(DNS,Domain Name System,域名系統(tǒng))負(fù)責(zé)將域名轉(zhuǎn)化成IP地址,這樣才能和主機(jī)建立連接。
- 在瀏覽器中輸入www.qq.com 域名,操作系統(tǒng)會先檢查自己本地的
hosts文件
是否有這個網(wǎng)址映射關(guān)系,如果有,就先調(diào)用這個IP地址映射,完成域名解析。 - 如果hosts里沒有這個域名的映射,則查找
本地DNS解析器緩存
,是否有這個網(wǎng)址映射關(guān)系,如果有,直接返回,完成域名解析。 - 如果hosts與本地DNS解析器緩存都沒有相應(yīng)的網(wǎng)址映射關(guān)系,首先會找TCP/IP參數(shù)中設(shè)置的首選DNS服務(wù)器,在此我們叫它
本地DNS服務(wù)器
,此服務(wù)器收到查詢時,如果要查詢的域名,包含在本地配置區(qū)域資源中,則返回解析結(jié)果給客戶機(jī),完成域名解析,此解析具有權(quán)威性。 - 如果要查詢的域名,不由本地DNS服務(wù)器區(qū)域解析,但該服務(wù)器已
緩存
了此網(wǎng)址映射關(guān)系,則調(diào)用這個IP地址映射,完成域名解析,此解析不具有權(quán)威性。 - 如果本地DNS服務(wù)器本地區(qū)域文件與緩存解析都失效,則根據(jù)本地DNS服務(wù)器的設(shè)置(是否設(shè)置轉(zhuǎn)發(fā)器)進(jìn)行查詢,如果未用轉(zhuǎn)發(fā)模式,本地DNS就把請求發(fā)至13臺根DNS,根DNS服務(wù)器收到請求后會判斷這個域名(.com)是誰來授權(quán)管理,并會返回一個負(fù)責(zé)該頂級域名服務(wù)器的一個IP。本地DNS服務(wù)器收到IP信息后,將會聯(lián)系負(fù)責(zé).com域的這臺服務(wù)器。這臺負(fù)責(zé).com域的服務(wù)器收到請求后,如果自己無法解析,它就會找一個管理.com域的下一級DNS服務(wù)器地址(http://qq.com)給本地DNS服務(wù)器。當(dāng)本地DNS服務(wù)器收到這個地址后,就會找(http://qq.com)域服務(wù)器,重復(fù)上面的動作,進(jìn)行查詢,直至找到www.qq.com主機(jī)。
- 如果用的是轉(zhuǎn)發(fā)模式,此DNS服務(wù)器就會把請求轉(zhuǎn)發(fā)至上一級DNS服務(wù)器,由上一級服務(wù)器進(jìn)行解析,上一級服務(wù)器如果不能解析,或找根DNS或把轉(zhuǎn)請求轉(zhuǎn)至上上級,以此循環(huán)。不管是本地DNS服務(wù)器用是是轉(zhuǎn)發(fā),還是根提示,最后都是把結(jié)果返回給本地DNS服務(wù)器,由此DNS服務(wù)器再返回給客戶機(jī)。
2.3 通信要素二:端口號
網(wǎng)絡(luò)的通信,本質(zhì)上是兩個進(jìn)程(應(yīng)用程序)的通信。每臺計算機(jī)都有很多的進(jìn)程,那么在網(wǎng)絡(luò)通信時,如何區(qū)分這些進(jìn)程呢?
如果說IP地址可以唯一標(biāo)識網(wǎng)絡(luò)中的設(shè)備,那么端口號就可以唯一標(biāo)識設(shè)備中的進(jìn)程(應(yīng)用程序)。
不同的進(jìn)程,設(shè)置不同的端口號。
-
端口號:用兩個字節(jié)表示的整數(shù),它的取值范圍是0~65535。
- 公認(rèn)端口:0~1023。被預(yù)先定義的服務(wù)通信占用,如:HTTP(80),F(xiàn)TP(21),Telnet(23)
- 注冊端口:1024~49151。分配給用戶進(jìn)程或應(yīng)用程序。如:Tomcat(8080),MySQL(3306),Oracle(1521)。
- 動態(tài)/ 私有端口:49152~65535。
如果端口號被另外一個服務(wù)或應(yīng)用所占用,會導(dǎo)致當(dāng)前程序啟動失敗。
2.4 通信要素三:網(wǎng)絡(luò)通信協(xié)議
通過計算機(jī)網(wǎng)絡(luò)可以使多臺計算機(jī)實現(xiàn)連接,位于同一個網(wǎng)絡(luò)中的計算機(jī)在進(jìn)行連接和通信時需要遵守一定的規(guī)則,這就好比在道路中行駛的汽車一定要遵守交通規(guī)則一樣。
-
網(wǎng)絡(luò)通信協(xié)議
:在計算機(jī)網(wǎng)絡(luò)中,這些連接和通信的規(guī)則被稱為網(wǎng)絡(luò)通信協(xié)議,它對數(shù)據(jù)的傳輸格式、傳輸速率、傳輸步驟、出錯控制等做了統(tǒng)一規(guī)定,通信雙方必須同時遵守才能完成數(shù)據(jù)交換。
新的問題:網(wǎng)絡(luò)協(xié)議涉及內(nèi)容太多、太復(fù)雜。如何解決?
計算機(jī)網(wǎng)絡(luò)通信涉及內(nèi)容很多,比如指定源地址和目標(biāo)地址,加密解密,壓縮解壓縮,差錯控制,流量控制,路由控制,如何實現(xiàn)如此復(fù)雜的網(wǎng)絡(luò)協(xié)議呢?通信協(xié)議分層思想
。
在制定協(xié)議時,把復(fù)雜成份分解成一些簡單的成份,再將它們復(fù)合起來。最常用的復(fù)合方式是層次方式,即同層間可以通信、上一層可以調(diào)用下一層,而與再下一層不發(fā)生關(guān)系
。各層互不影響,利于系統(tǒng)的開發(fā)和擴(kuò)展。
這里有兩套參考模型
- OSI參考模型:模型過于理想化,未能在因特網(wǎng)上進(jìn)行廣泛推廣
- TCP/IP參考模型(或TCP/IP協(xié)議):事實上的國際標(biāo)準(zhǔn)。
上圖中,OSI參考模型:模型過于理想化
,未能在因特網(wǎng)上進(jìn)行廣泛推廣。 TCP/IP參考模型(或TCP/IP協(xié)議):事實上的國際標(biāo)準(zhǔn)
。
- TCP/IP協(xié)議: 傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議( Transmission Control Protocol/Internet Protocol),TCP/IP 以其兩個主要協(xié)議:傳輸控制協(xié)議(TCP)和網(wǎng)絡(luò)互聯(lián)協(xié)議(IP)而得名,實際上是一組協(xié)議,包括多個具有不同功能且互為關(guān)聯(lián)的協(xié)議。是Internet最基本、最廣泛的協(xié)議。
TCP/IP協(xié)議中的四層介紹:
-
應(yīng)用層
:應(yīng)用層決定了向用戶提供應(yīng)用服務(wù)時通信的活動。主要協(xié)議有:HTTP協(xié)議、FTP協(xié)議、SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)、SMTP(簡單郵件傳輸協(xié)議)和POP3(Post Office Protocol 3的簡稱,即郵局協(xié)議的第3個版)等。 -
傳輸層
:主要使網(wǎng)絡(luò)程序進(jìn)行通信,在進(jìn)行網(wǎng)絡(luò)通信時,可以采用TCP協(xié)議,也可以采用UDP協(xié)議。TCP(Transmission Control Protocol)協(xié)議,即傳輸控制協(xié)議,是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。UDP(User Datagram Protocol,用戶數(shù)據(jù)報協(xié)議):是一個無連接的傳輸層協(xié)議、提供面向事務(wù)的簡單不可靠的信息傳送服務(wù)。 -
網(wǎng)絡(luò)層
:網(wǎng)絡(luò)層是整個TCP/IP協(xié)議的核心,支持網(wǎng)間互連的數(shù)據(jù)通信。它主要用于將傳輸?shù)臄?shù)據(jù)進(jìn)行分組,將分組數(shù)據(jù)發(fā)送到目標(biāo)計算機(jī)或者網(wǎng)絡(luò)。而IP協(xié)議是一種非常重要的協(xié)議。IP(internet protocal)又稱為互聯(lián)網(wǎng)協(xié)議。IP的責(zé)任就是把數(shù)據(jù)從源傳送到目的地。它在源地址和目的地址之間傳送一種稱之為數(shù)據(jù)包的東西,它還提供對數(shù)據(jù)大小的重新組裝功能,以適應(yīng)不同網(wǎng)絡(luò)對包大小的要求。
-
物理+數(shù)據(jù)鏈路層
:鏈路層是用于定義物理傳輸通道,通常是對某些網(wǎng)絡(luò)連接設(shè)備的驅(qū)動協(xié)議,例如針對光纖、網(wǎng)線提供的驅(qū)動。
3. 傳輸層協(xié)議:TCP與UDP協(xié)議
通信的協(xié)議還是比較復(fù)雜的,java.net
包中包含的類和接口,它們提供低層次的通信細(xì)節(jié)。我們可以直接使用這些類和接口,來專注于網(wǎng)絡(luò)程序開發(fā),而不用考慮通信的細(xì)節(jié)。
java.net
包中提供了兩種常見的網(wǎng)絡(luò)協(xié)議的支持:
- UDP:用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol)。
- TCP:傳輸控制協(xié)議 (Transmission Control Protocol)。
3.1 TCP協(xié)議與UDP協(xié)議
TCP協(xié)議:
- TCP協(xié)議進(jìn)行通信的兩個應(yīng)用進(jìn)程:客戶端、服務(wù)端。
- 使用TCP協(xié)議前,須先
建立TCP連接
,形成基于字節(jié)流的傳輸數(shù)據(jù)通道 - 傳輸前,采用“三次握手”方式,點對點通信,是
可靠的
- TCP協(xié)議使用
重發(fā)機(jī)制
,當(dāng)一個通信實體發(fā)送一個消息給另一個通信實體后,需要收到另一個通信實體確認(rèn)信息,如果沒有收到另一個通信實體確認(rèn)信息,則會再次重復(fù)剛才發(fā)送的消息。
- TCP協(xié)議使用
- 在連接中可進(jìn)行
大數(shù)據(jù)量的傳輸
- 傳輸完畢,需
釋放已建立的連接,效率低
UDP協(xié)議:
- UDP協(xié)議進(jìn)行通信的兩個應(yīng)用進(jìn)程:發(fā)送端、接收端。
- 將數(shù)據(jù)、源、目的封裝成數(shù)據(jù)包(傳輸?shù)幕締挝唬?code>不需要建立連接
- 發(fā)送不管對方是否準(zhǔn)備好,接收方收到也不確認(rèn),不能保證數(shù)據(jù)的完整性,故是
不可靠的
- 每個數(shù)據(jù)報的大小限制在
64K
內(nèi) - 發(fā)送數(shù)據(jù)結(jié)束時
無需釋放資源,開銷小,通信效率高
- 適用場景:音頻、視頻和普通數(shù)據(jù)的傳輸。例如視頻會議
TCP生活案例:打電話
UDP生活案例:發(fā)送短信、發(fā)電報
3.2 三次握手
TCP協(xié)議中,在發(fā)送數(shù)據(jù)的準(zhǔn)備階段,客戶端與服務(wù)器之間的三次交互,以保證連接的可靠。
- 第一次握手,客戶端向服務(wù)器端發(fā)起TCP連接的請求
- 第二次握手,服務(wù)器端發(fā)送針對客戶端TCP連接請求的確認(rèn)
- 第三次握手,客戶端發(fā)送確認(rèn)的確認(rèn)
1、客戶端會隨機(jī)一個初始序列號seq=x,設(shè)置SYN=1 ,表示這是SYN握手報文。然后就可以把這個 SYN 報文發(fā)送給服務(wù)端了,表示向服務(wù)端發(fā)起連接,之后客戶端處于
同步已發(fā)送
狀態(tài)。2、服務(wù)端收到客戶端的 SYN 報文后,也隨機(jī)一個初始序列號(seq=y),設(shè)置ack=x+1,表示收到了客戶端的x之前的數(shù)據(jù),希望客戶端下次發(fā)送的數(shù)據(jù)從x+1開始。
設(shè)置 SYN=1 和 ACK=1。表示這是一個SYN握手和ACK確認(rèn)應(yīng)答報文。最后把該報文發(fā)給客戶端,該報文也不包含應(yīng)用層數(shù)據(jù),之后服務(wù)端處于同步已接收
狀態(tài)。3、客戶端收到服務(wù)端報文后,還要向服務(wù)端回應(yīng)最后一個應(yīng)答報文,將ACK置為 1 ,表示這是一個應(yīng)答報文
ack=y+1 ,表示收到了服務(wù)器的y之前的數(shù)據(jù),希望服務(wù)器下次發(fā)送的數(shù)據(jù)從y+1開始。
最后把報文發(fā)送給服務(wù)端,這次報文可以攜帶數(shù)據(jù),之后客戶端處于 連接已建立 狀態(tài)。服務(wù)器收到客戶端的應(yīng)答報文后,也進(jìn)入連接已建立
狀態(tài)。
完成三次握手,連接建立后,客戶端和服務(wù)器就可以開始進(jìn)行數(shù)據(jù)傳輸了。由于這種面向連接的特性,TCP協(xié)議可以保證傳輸數(shù)據(jù)的安全,所以應(yīng)用十分廣泛,例如下載文件、瀏覽網(wǎng)頁等。
3.3 四次揮手
TCP協(xié)議中,在發(fā)送數(shù)據(jù)結(jié)束后,釋放連接時需要經(jīng)過四次揮手。
-
第一次揮手:客戶端向服務(wù)器端提出結(jié)束連接,
讓服務(wù)器做最后的準(zhǔn)備工作
。此時,客戶端處于半關(guān)閉狀態(tài),即表示不再向服務(wù)器發(fā)送數(shù)據(jù)了,但是還可以接受數(shù)據(jù)。 -
第二次揮手:服務(wù)器接收到客戶端釋放連接的請求后,
會將最后的數(shù)據(jù)發(fā)給客戶端
。并告知上層的應(yīng)用進(jìn)程不再接收數(shù)據(jù)。 -
第三次揮手:服務(wù)器發(fā)送完數(shù)據(jù)后,會給客戶端
發(fā)送一個釋放連接的報文
。那么客戶端接收后就知道可以正式釋放連接了。 -
第四次揮手:客戶端接收到服務(wù)器最后的釋放連接報文后,要
回復(fù)一個徹底斷開的報文
。這樣服務(wù)器收到后才會徹底釋放連接。這里客戶端,發(fā)送完最后的報文后,會等待2MSL,因為有可能服務(wù)器沒有收到最后的報文,那么服務(wù)器遲遲沒收到,就會再次給客戶端發(fā)送釋放連接的報文,此時客戶端在等待時間范圍內(nèi)接收到,會重新發(fā)送最后的報文,并重新計時。如果等待2MSL后,沒有收到,那么徹底斷開。
1、客戶端打算斷開連接,向服務(wù)器發(fā)送FIN報文(FIN標(biāo)記位被設(shè)置為1,1表示為FIN,0表示不是),F(xiàn)IN報文中會指定一個序列號,之后客戶端進(jìn)入FIN_WAIT_1狀態(tài)。也就是客戶端發(fā)出連接釋放報文段(FIN報文),指定序列號seq = u,主動關(guān)閉TCP連接,等待服務(wù)器的確認(rèn)。
2、服務(wù)器收到連接釋放報文段(FIN報文)后,就向客戶端發(fā)送ACK應(yīng)答報文,以客戶端的FIN報文的序列號 seq+1 作為ACK應(yīng)答報文段的確認(rèn)序列號ack = seq+1 = u + 1。接著服務(wù)器進(jìn)入CLOSE_WAIT(等待關(guān)閉)狀態(tài),此時的TCP處于半關(guān)閉狀態(tài)(下面會說什么是半關(guān)閉狀態(tài)),客戶端到服務(wù)器的連接釋放??蛻舳耸盏絹碜苑?wù)器的ACK應(yīng)答報文段后,進(jìn)入FIN_WAIT_2狀態(tài)。
3、服務(wù)器也打算斷開連接,向客戶端發(fā)送連接釋放(FIN)報文段,之后服務(wù)器進(jìn)入LASK_ACK(最后確認(rèn))狀態(tài),等待客戶端的確認(rèn)。服務(wù)器的連接釋放(FIN)報文段的FIN=1,ACK=1,序列號seq=m,確認(rèn)序列號ack=u+1。
4、客戶端收到來自服務(wù)器的連接釋放(FIN)報文段后,會向服務(wù)器發(fā)送一個ACK應(yīng)答報文段,以連接釋放(FIN)報文段的確認(rèn)序號 ack 作為ACK應(yīng)答報文段的序列號 seq,以連接釋放(FIN)報文段的序列號 seq+1作為確認(rèn)序號ack。文章來源:http://www.zghlxwxcb.cn/news/detail-426941.html
之后客戶端進(jìn)入TIME_WAIT(時間等待)狀態(tài),服務(wù)器收到ACK應(yīng)答報文段后,服務(wù)器就進(jìn)入CLOSE(關(guān)閉)狀態(tài),到此服務(wù)器的連接已經(jīng)完成關(guān)閉??蛻舳颂幱赥IME_WAIT狀態(tài)時,此時的TCP還未釋放掉,需要等待2MSL后,客戶端才進(jìn)入CLOSE狀態(tài)。文章來源地址http://www.zghlxwxcb.cn/news/detail-426941.html
到了這里,關(guān)于網(wǎng)絡(luò)編程(TCP與UDP協(xié)議)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!