學習了這么久的java技術, 但是這5個 socket/WebSocket/WebService/http/https 概念還不是很清楚, 總是很模糊,或者是弄混. 慚愧! !
學習之前, 要對這個網絡七層協議有個了解
網絡七層協議從低到高: 1、物理層(Physical Layer)、 2、數據鏈路層(Data Link Layer)、 3、網絡層(Network Layer)、 4、傳輸層(Transport Layer)、 ---------socket(發動機/提供了網絡通信的能力。socket是一切通過端口通信的基礎(包括http)) 5、會話層(Session Layer)、 6、表示層(Presentation Layer)、 7、應用層(Application Layer) ---------http(轎車/提供了封裝或者顯示數據的具體形式(超文本傳輸協議)) /webSocket(是HTML5規范提出的一種協議,基於也是應用層) /FTP協議(File Transfer Protocol,文件傳輸協議)
最通俗易懂的網絡應用層協議詳解 :https://blog.csdn.net/qq992817263/article/details/56669228
什么是協議? : 協議是一種約定,我們規定好一種信息的格式,如果發送方按照這種請求格式發送信息,那么接收端就要按照這樣的格式解析數據。這就是協議。
一.socket(傳輸控制層接口)
1.1 socket傳輸的定義
所謂socket通常也稱作"套接字",實現服務器和客戶端之間的物理連接,並進行數據傳輸,主要有udp和tcp兩個協議。socket處於網絡協議的傳輸層。Socket其實並不是一個協議,而是為了方便使用TCP或UDP而抽象出來的一層,是位於應用層和傳輸控制層之間的一組接口。
udp協議:廣播式數據傳輸,不進行數據驗證
tcp協議:傳輸控制協議,一種面向連接的協議,給用戶進程提供可靠的全雙工的字節流。
補充:
“Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口,提供一套調用TCP/IP協議的API。
在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。”
當兩台主機通信時,必須通過Socket連接,Socket則利用TCP/IP協議建立TCP連接。TCP連接則更依靠於底層的IP協議,IP協議的連接則依賴於鏈路層等更低層次.
1.2 socket傳輸的特點:
優點
1) 傳輸數據為字節級,傳輸數據可自定義,數據量小(對於手機應用講:費用低)
2) 傳輸數據時間短,性能高
3) 適合於客戶端和服務器端之間信息實時交互
4) 可以加密,數據安全性強
缺點:
1) 需對傳輸的數據進行解析,轉化成應用級的數據
2) 對開發人員的開發水平要求高
3) 相對於http協議傳輸,增加了開發量
1.3 socket傳輸適用范圍
基於socket傳輸的特點 : socket 傳輸方式適合於對傳輸速度,安全性,實時交互,費用等要求高的應用中,如網絡游戲,手機應用,銀行內部交互等
二. WebSocket(應用層協議)
1.1 WebSocket協議是什么?
WebSocket是HTML5規范提出的一種協議;目前除了IE瀏覽器,其他瀏覽器都基本支持。和HTTP協議是並存的兩種協議(Websocket和HTTP有關系,但是關系不大, websocket在首次建立連接時要使用下http協議(服務器返回101,則表示c/s由http協議升級websocket協議成功)。但是值得注意的是,這只是他們之間唯一的僅有的相同點。除此之外,他們完全不同。,如圖:
)。
WebSocket是HTML5中的協議。HTML5 Web Sockets規范定義了Web Sockets API,支持頁面使用Web Socket協議與遠程主機進行全雙工的通信。它引入了WebSocket接口並且定義了一個全雙工的通信通道,通過一個單一的套接字在Web上進行操作。HTML5 Web Sockets以最小的開銷高效地提供了Web連接。相較於經常需要使用推送實時數據到客戶端甚至通過維護兩個HTTP連接來模擬全雙工連接的舊的輪詢或長輪詢(Comet)來說,這就極大的減少了不必要的網絡流量與延遲。
1.2 WebSocket協議有什么特點?
♥ Websocket是基於HTTP協議的.但是和http最大的不同是:
a. WebSocket是一種雙向通信協議。在建立連接后,WebSocket服務器端和客戶端都能主動向對方發送或接收數據,就像Socket一樣;(而http服務端不能主動聯系客戶端,只能有客戶端發起,太被動啦)
b. WebSocket需要像TCP一樣,先建立連接,連接成功后才能相互通信
補充: 傳統http是 一發一收關閉,每次請求-應答都需要客戶端與服務端建立連接的模式(每次都要重新發起連接請求).
而一旦WebSocket連接建立后,在客戶端斷開WebSocket連接或Server端中斷連接前,不需要客戶端和服務端重新發起連接請求。
♥ Websocket是一個持久化的協議.
(只要建立一次HTTP請求,就可以連續不斷的得到服務器推送的消息,節省帶寬和服務器端的壓力,也可以用long poll
和ajax 輪詢
來 模擬出類似的效果)
eg: 客戶端:我要建立websocket連接
服務器端:好的,已經切換到websocket協議,websocket連接已經建立
客戶端: 有什么消息要及時告訴(推送)我
服務器端:好的
服務器端:xxxxxx
服務器端:yyyyyyy
。。。。。
1.3 WebSocket 協議案例
首先我們來看個典型的 Websocket
握手
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com
熟悉HTTP的同學可能發現了,這段類似HTTP協議的握手請求中,多了幾個東西。我會順便講解下作用。
Upgrade: websocket Connection: Upgrade
這個就是Websocket的核心了,告訴 Apache
、 Nginx
等服務器:注意啦,我發起的是Websocket協議,快點幫我找到對應的助理處理~不是那個老土的HTTP。
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13
首先, Sec-WebSocket-Key
是一個 Base64 encode
的值,這個是瀏覽器隨機生成的,告訴服務器:不要忽悠窩,我要驗證你是不是真的是Websocket助理。
然后, Sec_WebSocket-Protocol
是一個用戶定義的字符串,用來區分同URL下,不同的服務所需要的協議。簡單理解:今天我要服務A,別搞錯啦~
最后, Sec-WebSocket-Version
是告訴服務器所使用的 Websocket Draft
(協議版本).
然后服務器會返回下列東西,表示已經接受到請求, 成功建立Websocket啦!
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat
這里開始就是HTTP最后負責的區域了,告訴客戶,我已經成功切換協議啦~
Upgrade: websocket Connection: Upgrade
摘抄於: https://blog.csdn.net/frank_good/article/details/50856585 和 https://www.zhihu.com/question/20215561
1.4 Websocket應用場景
可以實現客戶端與服務器端的通信,實現服務器的推送功能.
補充:(在程序設計中,這種設計叫做回調,即:你有信息了再來通知我,而不是我傻乎乎的每次跑來問你 )
三. WebService(服務)
1.1 什么是WebService?(建議看百度百科,有更詳細的介紹)
WebService是一種跨編程語言和跨操作系統平台的遠程調用技術。
所謂跨編程語言和跨操作平台,就是說服務端程序采用java編寫,客戶端程序則可以采用其他編程語言編寫,反之亦然!跨操作系統平台則是指服務端程序和客戶端程序可以在不同的操作系統上運行。
所謂遠程調用,就是一台計算機a上 的一個程序可以調用到另外一台計算機b上的一個對象的方法。
1.2 WebService平台技術
XML+XSD,SOAP和WSDL就是構成WebService平台的三大技術。
• XML+XSD
WebService采用HTTP協議傳輸數據,采用XML格式封裝數據(即XML中說明調用遠程服務對象的哪個方法,傳遞的參數是什么,以及服務對象的 返回結果是什么)。XML是WebService平台中表示數據的格式。除了易於建立和易於分析外,XML主要的優點在於它既是平台無關的,又是廠商無關 的。無關性是比技術優越性更重要的:軟件廠商是不會選擇一個由競爭對手所發明的技術的。
XML解決了數據表示的問題,但它沒有定義一套標准的數據類型,更沒有說怎么去擴展這套數據類型。例如,整形數到底代表什么?16位,32位,64位?這 些細節對實現互操作性很重要。XML Schema(XSD)就是專門解決這個問題的一套標准。它定義了一套標准的數據類型,並給出了一種語言來擴展這套數據類型。WebService平台就 是用XSD來作為其數據類型系統的。當你用某種語言(如VB.NET或C#)來構造一個Web service時,為了符合WebService標准,所 有你使用的數據類型都必須被轉換為XSD類型。你用的工具可能已經自動幫你完成了這個轉換,但你很可能會根據你的需要修改一下轉換過程。
• SOAP
WebService通過HTTP協議發送請求和接收結果時,發送的請求內容和結果內容都采用XML格式封裝,並增加了一些特定的HTTP消息頭,以說明 HTTP消息的內容格式,這些特定的HTTP消息頭和XML內容格式就是SOAP協議。SOAP提供了標准的RPC方法來調用Web Service
SOAP協議 = HTTP協議 + XML數據格式
SOAP協議定義了SOAP消息的格式,SOAP協議是基於HTTP協議的,SOAP也是基於XML和XSD的,XML是SOAP的數據編碼方式。打個比 喻:HTTP就是普通公路,XML就是中間的綠色隔離帶和兩邊的防護欄,SOAP就是普通公路經過加隔離帶和防護欄改造過的高速公路。
• WSDL
好比我們去商店買東西,首先要知道商店里有什么東西可買,然后再來購買,商家的做法就是張貼廣告海報。 WebService也一樣,WebService客戶端要調用一個WebService服務,首先要有知道這個服務的地址在哪,以及這個服務里有什么方 法可以調用,所以,WebService務器端首先要通過一個WSDL文件來說明自己家里有啥服務可以對外調用,服務是什么(服務中有哪些方法,方法接受 的參數是什么,返回值是什么),服務的網絡地址用哪個url地址表示,服務通過什么方式來調用。
WSDL(Web Services Description Language)就是這樣一個基於XML的語言,用於描述Web Service及其函數、參數和返回值。它是WebService客戶端和服務器端都 能理解的標准格式。因為是基於XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的 Web service生成WSDL文檔,又能導入WSDL文檔,生成調用相應WebService的代理類代碼。
WSDL 文件保存在Web服務器上,通過一個url地址就可以訪問到它。客戶端要調用一個WebService服務之前,要知道該服務的WSDL文件的地址。 WebService服務提供商可以通過兩種方式來暴露它的WSDL文件地址:1.注冊到UDDI服務器,以便被人查找;2.直接告訴給客戶端調用者。
1.3 WebService 開發
WebService開發可以分為服務器端開發和客戶端開發兩個方面
• 服務端開發:把公司內部系統的業務方法發布成WebService服務,供遠程合作單位和個人調用。
• 客戶端開發:調用別人發布的WebService服務。
1.4 WebService 的工作調用原理
對客戶端而言,我們給這各類WebService客戶端API傳遞wsdl文件的url地址,這些API就會創建出底層的代理類,我調用 這些代理,就可以訪問到webservice服務。代理類把客戶端的方法調用變成soap格式的請求數據再通過HTTP協議發出去,並把接收到的soap 數據變成返回值返回。對服務端而言,各類WebService框架的本質就是一個大大的Servlet,當遠程調用客戶端給它通過http協議發送過來 soap格式的請求數據時,它分析這個數據,就知道要調用哪個java類的哪個方法,於是去查找或創建這個對象,並調用其方法,再把方法返回的結果包裝成 soap格式的數據,通過http響應消息回給客戶端。
1.5 WebService與Socket的區別
自己去網上找一下.理解一下.
1.6 WebService的優點 / 缺點:
Webservcie由於是遵循標准的soap協議,soap 協議的內容格式固定,soap協議傳遞的內容是xml數據,由於webservice是基於http的,所以簡單理解為soap=http+xml,適用於沒有性能要求情況下且數據傳輸量小,推薦在公開接口上使用webservice,因為soap協議的標准的。
優點如下:
• 可操作的的分布式應用程序
可以實現不同應用程序和在不同系統平台上開發出來的應用程序之間通信。與RMI、DOCM、CORBA最大的不同就是:Web Service 以 SOAP 作為基本通信協議從而避免了復雜的協議轉換.
• Web Service 甚至可以穿越防火牆,真正的自由通信
一般要訪問的Web服務器以及要訪問的Web Service的客戶端很可能位於防火牆后面,都默認關閉其它端口而開放HTTP端口,而Web service 正是基於HTTP的,所以它可以穿越防火牆.
• 普遍性、使用HTTP和XML進行通信
任何支持HTTP和XML 技術的設備都可以擁有和訪問Web Service,不同平台不同開發語言照樣可以調用我們發布的Web Service.
• 應用程序集成
企業級的應用程序開發者都知道,企業里經常都要把用不同語言寫成的、在不同平台上運行的各種程序集成起來,而這種集成將花費很大的開發力量。應用程序經常需要從運行在IBM 主機上的程序中獲取數據;或者把數據發送到主機或UNIX 應用程序中去。即使在同一個平台上,不同軟件廠商生產的各種軟件也常常需要集成起來。通過WebService ,應用程序可以用標准的方法把功能和數據“ 暴露” 出來,供其它應用程序使用。
• B2B 的集成
用WebService 集成應用程序,可以使公司內部的商務處理更加自動化。但當交易跨越供應商和客戶、突破公司的界限時會怎么樣呢?跨公司的商務交易集成通常叫做B2B 集成。WebService 是B2B 集成成功的關鍵。通過WebService ,公司可以把關鍵的商務應用“ 暴露” 給指定的供應商和客戶。
缺點如下:
缺點一:單機應用程序
目前,企業和個人還使用着很多桌面應用程序。其中一些只需要與本機上的其它程序通信。在這種情況下,最好就不要用WebService ,只要用本地的 API 就可以了。COM 非常適合於在這種情況下工作,因為它既小又快。運行在同一台服務器上的服務器軟件也是這樣。最好直接用COM 或其它本地的API 來 進行應用程序間的調用。當然WebService 也能用在這些場合,但那樣不僅消耗太大,而且不會帶來任何好處。
缺點二:局域網的同構應用程序
在許多應用中,所有的程序都是用VB 或VC 開發的,都在Windows 平台下使用COM ,都運行在同一個局域網上。例如,有兩個服務器應用程序需要相互通信,或者有一個Win32 或WinForm 的客戶程序要連接局域網上另一個服務器的程序。在這些程序里,使用DCOM(docm: 分布式組件對象模型,分布式組件對象模式) 會比SOAP/HTTP 有效得多。 與此相類似,如果一個.NET 程序要連接到局域網上的另一個.NET 程序,應該使用.NETremoting 。有趣的是,在.NETremoting 中, 也可以指定使用SOAP/HTTP 來進行WebService 調用。不過最好還是直接通過TCP 進行RPC(rpc: 遠程過程調用) 調用,那樣會有效得多。
對WebService作補充:
一、WebService是什么?
1. 基於Web的服務:服務器端整出一些資源讓客戶端應用訪問(獲取數據) 2. 一個跨語言、跨平台的規范(抽象) 3. 多個跨平台、跨語言的應用間通信整合的方案(實際) 二、為什么要用Web service? web service能解決: 跨平台調用 跨語言調用 遠程調用 三、什么時候使用web Service? 1. 同一家公司的新舊應用之間 2. 不同公司的應用之間 3. 一些提供數據的內容聚合應用:天氣預報、股票行情
四、WebService中的幾個重要術語 4.1、WSDL(web service definition language) WSDL是webservice定義語言, 對應.wsdl文檔, 一個webservice會對應一個唯一的wsdl文檔, 定義了客戶端與服務端發送請求和響應的數據格式和過程 4.2、SOAP(simple object access protocal) SOAP是"簡單對象訪問協議" 1.是一種簡單的、基於HTTP和XML的協議, 用於在WEB上交換結構化的數據 2.soap消息:請求消息和響應消息
4.3、SEI(WebService EndPoint Interface) SEI是web service的終端接口,就是WebService服務器端用來處理請求的接口 4.4、CXF(Celtix + XFire) 一個apache的用於開發webservice服務器端和客戶端的框架。
五.總結
Web service是創建可互操作的分布式應用程序的新平台。Web service 的主要目標是跨平台的可互操作性。為了達到這一目標,Web service 是完全基於XML、XSD等獨立於平台、獨立於軟件供應商的標准的。
Web service在應用程序跨平台和跨網絡進行通信的時候是非常有用的。Web service適用於應用程序集成、B2B集成、代碼和數據重用,以及通過Web進行客戶端和服務器的通信的場合。
當然,Web service也不是萬能的,你不能到處濫用Web service.在有些情況下,Web service 會降低應用程序的性能,而不會帶來任何好處。
例如,一台機器或一個局域網里面運行的同構應用程序就不應該用Web service 進行通信
優秀博文(建議關注這個大佬博客獲取跟多Webservice好文):
https://www.cnblogs.com/xdp-gacl/p/4259109.html
https://www.cnblogs.com/ShaYeBlog/p/4129427.html
四. http(應用層協議)
1.http 是什么?
http :超文本傳輸協議(HTTP,HyperText Transfer Protocol) ,是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標准。
是一種建立在TCP上的無狀態連接,整個基本的工作流程是客戶端發送一個HTTP請求,說明客戶端想要訪問的資源和請求的動作,服務端收到請求之后,服務端開始處理請求,並根據請求做出相應的動作訪問服務器資源,最后通過發送HTTP響應把結果返回給客戶端。
補充: HTTP中永遠是這樣,也就是說一個request只能有一個response。而且這個response也是被動的,不能主動發起。(且每次都要重新建立連接,這點不及WebSocket協議優秀)
2.http請求 和 響應
• 請求:
HTTP請求是客戶端往服務端發送請求動作,告知服務器自己的要求。
HTTP請求由狀態行、請求頭、請求正文三部分組成:
狀態行:包括請求方式Method(GET、POST、PUT上傳、DELETE刪除)、資源路徑URL、協議版本Version;
請求頭:包括一些訪問的域名、用戶代理、Cookie等信息;
請求正文:就是HTTP請求的數據。
• 響應:
服務器收到了客戶端發來的HTTP請求后,根據HTTP請求中的動作要求,服務端做出具體的動作,將結果回應給客戶端,稱為HTTP響應.
HTTP響應由三部分組成:狀態行、響應頭、響應正文.
狀態行:包括協議版本Version、狀態碼Status Code、回應短語;
響應頭:包括搭建服務器的軟件,發送響應的時間,回應數據的格式等信息;
響應正文:就是響應的具體數據。
補充:HTTP響應的狀態碼 : https://blog.csdn.net/dufufd/article/details/53112184
3.http的優缺點
優點: 1.支持客戶/服務器模式。 2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。 3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type(Content-Type是HTTP包中用來表示內容類型的標識)加以標記。 4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。 5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。 缺點: 1.通信使用明文(不加密),內容可能會被竊聽 • HTTP 報文使用明文(指未經過加密的報文)方式發送. eg:被人抓包 2.不驗證通信方的身份, 因此可能遭遇偽裝 • 無法判定請求是來自何方、出自誰手 • 無意義的請求也會照單全收 HTTP 協議中的請求和響應不會對通信方進行確認。也就是說存在“服務器是否就是發送請求中 URI 真正指定的主機,返回的響應是否真的返回到實際提出請求的客戶端”等類似問題(解決這個問題,要用ssl:https://baike.baidu.com/item/ssl/320778?fr=aladdin)。 在 HTTP 協議通信時,由於不存在確認通信方的處理步驟,任何人都可以發起請求! 另外,服務器只要接收到請求,不管對方是誰都會返回一個響應(但也僅限於發送端的 IP 地址和端口號沒有被 Web 服務器設定限制訪問的前提下,類似於白名單). 3.無法證明報文的完整性, 所以有可能已遭篡改 所謂完整性是指信息的准確度。若無法證明其完整性,通常也就意味着無法判斷信息是否准確。 由於 HTTP 協議無法證明通信的報文完整性,因此,在請求或響應送出之后直到對方接收之前的這段時間內,即使請求或響應的內容遭到篡改,也沒有辦法獲悉。換句話說,沒有任何辦法確認,發出的請求 / 響應和接收到的請求 / 響應是前后相同的。 4. 缺點補充 1) 傳輸速度慢,數據包大(http協議中包含輔助應用信息,eg:header頭中帶着大量信息) 2) 如實時交互,服務器性能壓力大。 3) 數據傳輸安全性差
4.http1.0 和1.1版本的區別
發展到如今有2個版本: HTTP 1.0版本 / HTTP 1.1版本(普遍使用) / HTTP 2.0. http幾個版本重點區別如下:
1.HTTP 1.0需要使用keep-alive參數來告知服務器端要建立一個長連接,而HTTP1.1默認支持長連接。
補充長連接和短連接的區別: https://blog.csdn.net/q547550831/article/details/50445385
HTTP1.1默認支持長連接的優點: HTTP是基於TCP/IP協議的,創建一個TCP連接是需要經過三次握手的,有一定的開銷,如果每次通訊都要重新建立連接的話,對性能有影響。因此最好能維持一個長連接,可以用個長連接來發多個請求。節省帶寬但安全性較差.
2. .............
5. http優秀的資料必看
百度百科 :https://baike.baidu.com/item/http/243074?fr=aladdin
http總結 :http://www.cnblogs.com/ranyonsue/p/5984001.html
五. https(應用層協議)
1.1 https是什么?
https 是超文本傳輸安全協議,是以安全為目標的HTTP通道,簡單講是HTTP的安全版。
即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。https:URL表明它使用了HTTP,但HTTPS存在不同於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統的最初研發由網景公司(Netscape)進行,並內置於其瀏覽器Netscape Navigator中,提供了身份驗證與加密通訊方法。現在它被廣泛用於萬維網上安全敏感的通訊,例如交易支付方面.
補充:已經有了http , 為什么還要用https?
1.2 https 和 http 的區別?
•http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
•https協議需要到ca申請證書,一般免費證書很少,需要交費。
•http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
•http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全
1.3 https參考資料
百度百科: https://baike.baidu.com/item/https/285356?fr=aladdin
這幾天做了一個搬運工, 同時也對 socket/WebSocket/WebService/http/https (或許不該放一起比較,原諒我,因為我是發現這5個唯一的共同點 :就是能讓客戶端和服務器進行通信)有了一個更加全面的分析和認識度, 這5個 哈哈哈, 根本不是同一個東西, 以前不明確,總是以為都差不多, 細細認知下來, 天大的差別. 感謝大v們在網上的分享.謝謝您們!
溫故而知新, 加油!