WebService 及java網絡編程等基礎概念(一)

1. 基礎概念

1.1Web

web的本意是蜘蛛網和網的意思,在網頁設計中我們稱爲網頁的意思。現廣泛譯作網絡、互聯網等技術領域。表現爲三種形式,即超文本(hypertext)、超媒體(hypermedia)、超文本傳輸協議(HTTP)等。 如下圖:

 

1.2  Web服務器

Internet上的服務器也稱爲Web服務器,是一臺在Internet上具有獨立IP地址的計算機,可以向Internet上的客戶機提供各種Internet服務。如下圖:

1.3Web服務程序

單獨的web服務器是無法完成請求與響應的,因爲計算機只有安裝軟件纔可以工作,所以真正處理web請求與響應的是web服務程序的作用,所以網上也有將web服務器直接稱爲web服務程序原因就是這個。如下圖:

 

1.4HTTP

超文本傳輸協議 (HTTP-Hypertext transfer protocol)是一種詳細規定了瀏覽器和Web服務器之間互相通信的規則,HTTP由請求和響應構成,是一個標準的客戶端服務器模型。

http通常使用get或post方式進行請求:

用途上的區別是:get用於請求獲取資源,比如獲取一條新聞;而post用於提交更新資源,比如在論壇發佈文章;

使用方法上的區別是:get請求需要將請求的參數寫在http的url中;而post請求是將請求的數據放在網頁的Form表單中提交。

 

 

TCP/IP

協議是用來描述程序之間信息交換數據時的規則術語。在計算機網絡中,兩個相互通信的程序處在不同的地理位置,需要通過交換信息來滿足某種需求,而信息的交換必須按照預先共同約定好的規則進行。要想讓兩臺計算機進行通信,必須使它們採用相同的信息交換規則。我們把在計算機網絡中用於規定信息的格式以及如何發送和接收信息的一套規則稱爲網絡協議(network protocol)或通信協議。

其中圖5.8(a)是OSI的七層協議體系結構,圖、圖5.8(b)是TCP/IP四層體系結構、圖5.8(c)是五層協議的體系結構。五層協議的體系結構綜合了前兩種體系結構的優點,既簡潔又能將概念闡述清楚。

TCP/IP協議作爲互聯網的基礎協議,沒有它就根本不可能上網,任何和互聯網有關的操作都離不開TCP/IP協議。TCP/IP協議不是TCP和IP這兩個協議的合稱,而是指因特網整個TCP/IP協議族。

從協議分層模型方面來講,TCP/IP由四個層次組成:網絡接口層、網絡層、傳輸層、應用層。

 

 

TCP

TCP是一種面向連接的協議,提供可靠的數據傳輸,一般服務質量要求比較高的情況,使用這個協議。TCP支持的應用協議主要有:Telnet、FTP、SMTP、HTTP等;

UDP

UDP---用戶數據報協議,是一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。UDP支持的應用層協議主要有:NFS(網絡文件系統)、SNMP(簡單網絡管理協議)、DNS(主域名稱系統)、TFTP(通用文件傳輸協議)等。

 

Sokect

要想理解socket首先得熟悉一下TCP/IP協議族, TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,定義了主機如何連入因特網及數據如何再它們之間傳輸的標準,

從字面意思來看TCP/IP是TCP和IP協議的合稱,但實際上TCP/IP協議是指因特網整個TCP/IP協議族。不同於ISO模型的七個分層,TCP/IP協議參考模型把所有的TCP/IP系列協議歸類到四個抽象層中

應用層:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等

傳輸層:TCP,UDP

網絡層:IP,ICMP,OSPF,EIGRP,IGMP

數據鏈路層:SLIP,CSLIP,PPP,MTU

每一抽象層建立在低一層提供的服務上,並且爲高一層提供服務,看起來大概是這樣子的

                        

估計有興趣打開此文的同學都對此有一定了解了,加上我也是一知半解,所以就不詳細解釋,有興趣同學可以上網上搜一下資料

維基百科 

百度百科

在TCP/IP協議中兩個因特網主機通過兩個路由器和對應的層連接。各主機上的應用通過一些數據通道相互執行讀取操作

 

socket

我們知道兩個進程如果需要進行通訊最基本的一個前提能能夠唯一的標示一個進程,在本地進程通訊中我們可以使用PID來唯一標示一個進程,但PID只在本地唯一,網絡中的兩個進程PID衝突機率很大,這時候我們需要另闢它徑了,我們知道IP層的ip地址可以唯一標示主機,而TCP層協議和端口號可以唯一標示主機的一個進程,這樣我們可以利用ip地址+協議+端口號唯一標示網絡中的一個進程。

能夠唯一標示網絡中的進程後,它們就可以利用socket進行通信了,什麼是socket呢?我們經常把socket翻譯爲套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操作抽象爲幾個簡單的接口供應用層調用以實現進程在網絡中通信。

socket起源於UNIX,在Unix一切皆文件哲學的思想下,socket是一種"打開—讀/寫—關閉"模式的實現,服務器和客戶端各自維護一個"文件",在建立連接打開後,可以向自己文件寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉文件。

socket通信流程

socket是"打開—讀/寫—關閉"模式的實現,以使用TCP協議通訊的socket爲例,其交互流程大概是這樣子的

服務器根據地址類型(ipv4,ipv6)、socket類型、協議創建socket

服務器爲socket綁定ip地址和端口號

服務器socket監聽端口號請求,隨時準備接收客戶端發來的連接,這時候服務器的socket並沒有被打開

客戶端創建socket

客戶端打開socket,根據服務器ip地址和端口號試圖連接服務器socket

服務器socket接收到客戶端socket請求,被動打開,開始接收客戶端請求,直到客戶端返回連接信息。這時候socket進入阻塞狀態,所謂阻塞即accept()方法一直到客戶端返回連接信息後才返回,開始接收下一個客戶端諒解請求

客戶端連接成功,向服務器發送連接狀態信息

服務器accept方法返回,連接成功

客戶端向socket寫入信息

服務器讀取信息

客戶端關閉

服務器端關閉

三次握手

在TCP/IP協議中,TCP協議通過三次握手建立一個可靠的連接

第一次握手:客戶端嘗試連接服務器,向服務器發送syn包(同步序列編號Synchronize Sequence Numbers),syn=j,客戶端進入SYN_SEND狀態等待服務器確認

第二次握手:服務器接收客戶端syn包並確認(ack=j+1),同時向客戶端發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手

定睛一看,服務器socket與客戶端socket建立連接的部分其實就是大名鼎鼎的三次握手

 

 

客戶端/服務器模式

客戶端(Client)向服務器(Server)發出請求,服務器處理請求,處理完成向客戶端響應。如下圖:

 

2. 客戶端/服務器通信

 

便民查詢網站分析

爲了方便廣大網民日常查詢需求,通過便民查詢網站可以查詢手機號、ip地址、天氣等信息。

以上功能如何實現?

通常我們寫的javaweb應用從數據庫查詢數據,如下圖:

實時天氣信息在我們的系統數據庫中是不存在的,這時就需要通過一種接口技術調用存有天氣數據的系統,通過這個接口將天氣信息實時獲取過來在便民查詢網站展示。但是對方系統的環境我們是不知道的,這種接口技術必須是可以跨平臺訪問的。

 

我們今天講的webservice是一種跨平臺的遠程調用技術。

 

客戶端/服務器通信:

 

TCP是一種面向連接的協議,提供可靠的數據傳輸,一般服務質量要求比較高的情況,使用這個協議。TCP支持的應用協議主要有:Telnet、FTP、SMTP、HTTP等;

UDP---用戶數據報協議,是一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。UDP支持的應用層協議主要有:NFS(網絡文件系統)、SNMP(簡單網絡管理協議)、DNS(主域名稱系統)、TFTP(通用文件傳輸協議)等。

 

由於TCP協議具體有的可靠性的特點本功能選擇TCP協議通信獲取天氣信息。

 

 

Socket實現

Socket通信原理

 

 

第一步:服務端創建serverSocket,啓動服務、監聽端口

第二步:客戶端創建socket,連接服務端

第三步:客戶端通過outputstream發送數據至服務端

第四步:服務端通過inputstream接收客戶端發送的數據

第五步:服務端處理完畢通過outputstream發送數據至客戶端

第六步:客戶端通過inputstream接收服務端發送的數據

 

Socket服務端:

  1. /**
  2. * 天氣查詢服務端
  3. * @author 傳智播客 Java學院 苗潤土
  4. * @version V1.0
  5. */
  6. public class WeatherServer {
  7. public static void main(String[] args) throws IOException {
  8. //創建socket服務端對象
  9. ServerSocket serverSocket = new ServerSocket(1234);
  10. System.out.println("服務端已啓動。。。。");
  11. while(true){
  12. //監聽客戶端連接,accept方法爲阻塞方法
  13. Socket socket = serverSocket.accept();
  14. //獲取輸入流準備取客戶端發送的數據
  15. DataInputStream dataInputStream =null;
  16. DataOutputStream dataOutputStream =null;
  17. try {
  18. //包括爲datainputstream
  19. dataInputStream = new DataInputStream(socket.getInputStream());
  20. //讀取數據
  21. String in_data = dataInputStream.readUTF();
  22. //打印讀取的數據
  23. System.out.println("from client.."+in_data);
  24. //創建輸出流準備輸出數據
  25. dataOutputStream = new DataOutputStream(socket.getOutputStream());
  26. System.out.println("to client..."+"晴朗");
  27. dataOutputStream.writeUTF("晴朗");
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }finally{
  31. //釋放資源
  32. if(dataOutputStream!=null){
  33. dataOutputStream.close();
  34. }
  35. if(dataInputStream!=null){
  36. dataInputStream.close();
  37. }
  38. }
  39. }
  40. }
  41. }


 

 

Socket客戶端

  1. /**
  2. * 天氣查詢客戶端
  3. * @author 傳智播客 Java學院 苗潤土
  4. * @version V1.0
  5. */
  6. public class WeatherClient {
  7. public static void main(String[] args) throws UnknownHostException, IOException {
  8. while(true){
  9. //socket客戶端對象
  10. Socket socket = null;
  11. //輸出流用於發送數據
  12. DataOutputStream dataOutputStream = null;
  13. //輸入流用於接收數據
  14. DataInputStream dataInputStream = null;
  15. try {
  16. //創建socket
  17. socket = new Socket("127.0.0.1", 1234);
  18. socket.setSoTimeout(10000);//超時時間爲10秒,防止服務端處理超時返回數據失敗
  19. //創建輸出流準備向服務端發送數據
  20. dataOutputStream = new DataOutputStream(socket.getOutputStream());
  21. dataOutputStream.writeUTF("鄭州");
  22. System.out.println("to server...."+"鄭州");
  23. //接收服務端發送的數據
  24. dataInputStream = new DataInputStream(socket.getInputStream());
  25. String resultString = dataInputStream.readUTF();
  26. System.out.println("from server..."+resultString);
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }finally{
  30. //釋放資源
  31. if(socket!=null){
  32. socket.close();
  33. }
  34. if(dataOutputStream!=null){
  35. dataOutputStream.close();
  36. }
  37. if(dataInputStream!=null){
  38. dataInputStream.close();
  39. }
  40. }
  41. }
  42. }
  43. }


 

3.什麼是webservice

 Web service 即web服務,因爲互聯網而產生,發佈web服務後可以將資源進行共享,通過webservice調用獲取並操作資源信息。

webservice是一種跨編程語言和跨操作系統平臺的遠程調用技術即跨平臺遠程調用技術。

 採用標準SOAP(Simple Object Access Protocol)  協議傳輸,soap屬w3c標準。

基於http傳輸xml,即soap=http+xml

 採用wsdl作爲描述語言即webservice使用說明書,wsdl屬w3c標準。

 xml和XSD(XML Schema Datatypes)是webservice的跨平臺的基礎,XML主要的優點在於它既與平臺無關,又與廠商無關。XML是由萬維網協會(W3C)創建,W3C制定的XSD定義了一套標準的數據類型,數據類型用xml進行描述。

3.1webService三要素

soap

SOAP即簡單對象訪問協議(Simple Object Access Protocal)是一種簡單的基於XML的協議,它使應用程序通過HTTP來交換信息,簡單理解爲soap=http+xml。

Soap協議版本主要使用soap1.1、soap1.2

SOAP可以運行在任何其他應用協議上。例如,SMTP、tr069等。

wsdl

WSDL (網絡服務描述語言)是基於XML的用於描述Web Service及其函數、參數和返回值。通俗理解Wsdl是webservice的使用說明書。

UDDI

UDDI 是一種目錄服務,通過它,企業可註冊並搜索 Web services。企業將自己提供的Web Service註冊在UDDI,也可以使用別的企業在UDDI註冊的web service服務,從而達到資源共享。

UDDI旨在將全球的webservcie資源進行共享,促進全球經濟合作。

但是使用webservice並不是必須使用UDDI,因爲很多時候使用者已經知道了Web service地址並進行調用。

4.webService應用場景

1. 應用程序集成

分佈式程序之間進行集成使用webservice直接調用服務層方法,不僅縮短了開發週期,還減少了代碼複雜度,並能夠增強應用程序的可維護性。

2. 軟件重用

將一個軟件的功能以webservice方式暴露出來,達到軟件重用。例如上邊分析的天氣預報,將天氣查詢功能以webservice接口方式暴露出來非常容易集成在其它系統中;再比如一個第三方物流系統將快遞查詢、快遞登記暴露出來,從而集成在電子商務系統中。

3. 跨防火牆通信

如果一個大型系統是基於web的且用戶分佈在世界各地,除了以瀏覽器訪問系統頁面外,如果使用其它客戶端訪問服務器的功能,客戶端和服務器通信問題是大的問題,因爲客戶端和服務器之間通常會有防火牆或者代理服務器,這時如果使用webservice開發功能就可以很容易跨越防火牆,因爲webservice和網頁程序都是運行在web容器且用相同的端口和協議。

建議不用webservice

1. 單機程序間通信

這裏說的單機程序是指一個廠家開發的多個應用部署在一臺服務器,當程序之間需要通信且無需將接口暴露給第三方系統時完全沒有必要使用webservice技術,這時企業自定義一種簡單的接口協議即可,簡單高效。

2. 同構程序間通信

同構程序是指採用相同的編程語言的程序之間通信,比如java遠程調用RMi技術就可以非常高效的實現遠程調用,使用簡單方便,必需保證兩邊應用都是java編寫纔可使用。

總之,只要有其它方法比webservice更高效更可行就不要用webservice,因爲web跨平臺遠程調用方法不止webservice一種,需要擇優考慮。

建議使用webservice

1. 公開接口

面向互聯網公開的接口,例如:某公司產品促銷介紹、股票信息查詢等,因爲webservice是互聯網的一個標準協議,將接口發佈爲webservice,其它公司很容易使用。

2. 調用webservice服務端

你作爲客戶端要調用別人的接口,對方接口用的是webservice,這時你也用webservice開發客戶端,且協議版本要和服務端保持一致。

 

5.Webservice優缺點

優點:

1 、採用xml支持跨平臺遠程調用。

2、基於http的soap協議,可跨越防火牆。

3、支持面向對象開發。

4、有利於軟件和數據重用,實現松耦合。

缺點:

1、 由於soap是基於xml傳輸,本身使用xml傳輸會傳輸一些無關的東西從而效率不高,隨着soap協議的完善,soap協議增加了許多內容,這樣就導致了使用soap協議去完成簡單的數據傳輸的效率更加不高。

2、 webservice作爲web跨平臺訪問的標準技術,很多公司都限定要求使用webservice,其實對於簡單的接口如果直接用http傳輸自定義數據內容比webservice開發更快捷,例如第三方支付公司的支持接口。

現狀前景

就目前來看Webservice主要是作爲一種遠程調用技術而存在,而遠程調用的技術非常多,比webservice簡單方便的也有,比如http。但是隨是SOA的興起,面向服務構建應用的模式被推崇,隨着webservice標準的規範,相信Web服務將是未來應用架構的一個極爲重要的模式,隨着Web服務的深入人心,會有越來越多的應用採用Web服務架構開發,Web服務的需求將不斷增加。

像一些互聯網開發商yahoo、eBay及亞馬遜等,都提供了自己的Web服務,大大推動了企業B2B的進程。將來會有更多企業開放自己的Web服務,從中獲得更多的效益,這一切都由web服務所帶來的,當然web服務正在發展肯定還有更精彩的前景等待人們去開發。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章