一、WebService
1.什么是WebService
Web Service(WEB服務)能夠快捷和方便地綜合結合各種系統、商務和任何應用平台。利用最新的Web Service 標准能夠使任何軟件系統和系統之間的應用互通互聯,方便,而且更加廉價。
2.WebService的應用場合
(1)跨越防火牆通信
客戶端和服務器端之間通信都會有防火牆或者代理服務器。傳統的實現互相通信的方法是在分布式對象,如DCOM、CORBA之間進行相互的遠程過程調用(TCP/IP),但在這種場合下HTTP協議的特性沒有得到應用,因此在Internet環境下的遠程過程調用不是一件容易的事情,同時在Internet上使用遠程過程調用還存在安全問題,防火牆和代理服務器還有可能阻擋這種類型的數據傳輸。HTTP是在Internet上發送消息的標准協議。Web服務使用基於XML消息處理作為基本的數據通信方式,應用程序可以使用HTTP和XML消息等標准在基於Web的應用程序之間交換信息,從而跨越防火牆。
(2)應用程序集成
企業里經常要把不同語言寫成的在不同平台上運行的各種程序集成起來。大型公司常常有很多部門,每個部門都使用最適合自己特定需要的應用程序和平台。為了能夠讓公司各部門之間進行通信,首先應該將公司內部的應用程序和商業過程集成在一起。Web服務的開放標准使組織創建可重用的應用程序接口。當被包裝成一個或一組Web服務之后,任何應用程序理論上都可以通過SOAP消息與任何其他應用程序進行通信。
(3)軟件復用
軟件復用是在軟件開發中避免重復勞動的解決方案。Web服務實現了業務級別的軟件復用,例如在B2B的集成中,各企業之間通過互相調用Web服務,實現了Web服務的共享,Web服務的使用企業不需要再重新開發其他企業中已經存在的服務。
二、使用Socket遠程通信
1.客戶端
public class WeatherClient{ public static void main(String[] args) throws UnknownHostException, IOException{ //1.創建Socket對象,和服務端建立連接 Socket socket = new Socket("127.0.0.1",12345); //2.發送城市名稱 DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF("北京"); System.out.println("請求查詢天氣: 北京"); //3.接受返回結果使用輸入流 DataInputStream dis = new DataInputStream(socket.getInputStream()); String result = dis.readUTF(); System.out.println("北京的天氣: " + result); //4.關閉流 dis.close(); dos.close(); } }
2.服務端
/* * 天氣服務端 */ public class WeatherServer{ public static void main(String[] args) throws IOException{ // 1.創建ServerSocket對象 ServerSocket serverSocket = new ServerSocket(12345); while(true){ // 2.等待客戶端連接,阻塞的方法 final Socket socket = serverSocket.accept(); Runnable runnable = new Runnable(){ @Override public void run(){ try{ // 3.使用輸入流接受客戶端發送的請求 DataInputStream dis = new DataInputStream(socket.getInputStream()); String cityName = dis.readUTF(); System.out.println("接收到客戶端發送的請求: " + cityName); Thread.sleep(1000); // 4.根據城市名查詢天氣 String result = "今天天氣很熱"; System.out.println("返回天氣信息: " + result); // 5.返回查詢結果,使用輸出流。 DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF(result); // 6.關閉流 dis.close(); dos.close(); }catch(Exception e){ e.printStackTrace(); } } }; //啟動線程 new Thread(runnable).start(); } } }
結果:
請求查詢天氣: 北京
北京的天氣: 今天天氣很熱
接收到客戶端發送的請求: 北京
返回天氣信息: 今天天氣很熱
三、用WebService實現遠程調用
1.服務端
第一步: 創建一個java工程,不需要導入jar包。
第二步: 創建接口。在Webservice中叫做SEI(wsdl中叫做PortType)。
第三步: 創建實現類。需要在實現類上加一個@Webservice注解。
第四步: 發布服務。EndPoint.publish發布服務。
WeatherInterface.java
WeatherInterfaceImpl.java
WeatherServer.java
2.查看wsdl
a: 在地址欄輸入(注意后面的參數?wsdl)
http://127.0.0.1:12345/weather?wsdl
b: Wsdl不是webService,只是獲取一個用於描述WebService的說明文件
3.使用wsimport工具生成客戶端調用代碼
4.編寫客戶端
第1步:創建服務視圖對象。
第2步: 從服務視圖中獲得PortType對象。
第3步: 調用PortType的方法(可以實現遠程通信)
第4步: 接收方法的返回值(服務端響應的結果)。
四、WebService和Socket的對比
(1)Socket是基於TCP/IP的傳輸層協議。
Webservice是基於HTTP協議傳輸數據,http是基於tcp的應用層協議。
Webservice采用了基於http的soap協議傳輸數據。
(2)Socket接口通過流傳輸,不支持面向對象。
Webservice 接口支持面向對象,最終webservice將對象進行序列化后通過流傳輸。
Webservice采用soap協議進行通信,不需專門針對數據流的發送和接收進行處理,是一種跨平台的面向對象遠程調用技術。(3)Socket適用於高性能大數據的傳輸,傳輸的數據需要手動處理,socket通信的接口協議需要自定義。
比如:自定義一種字符串拼接的格式,比如自定義的xml數據,自定義麻煩之處在接口調用方和接口服務端需要互相討論確定接口的協議內容,不方便。
缺點程序員需要自己去解析輸入、輸出流,解析發送和接收的數據。數據傳輸的格式不固定,需要程序員開發socket接口時自定義接口協議。
優點
如果要傳輸大數據量,socket可以滿足,如果存在大並發使用socket也可以實現,程序用socket靈活性更大,比如可以socket的高並發框架mina開發。
Webservcie由於是遵循標准的soap協議,soap 協議的內容格式固定,soap協議傳遞的內容是xml數據,由於webservice是基於http的,所以簡單理解為soap=http+xml,適用於沒有性能要求情況下且數據傳輸量小,推薦在公開接口上使用webservice,因為soap協議的標准的。
優點
jaxws可以通過面向對象開發webservice,程序員不需要解析輸入、輸出流。
由於webservice傳輸數據使用標准的soap協議(基於http傳輸xml),soap協議已經被w3c管理了。
缺點如果傳輸大數據量,webservice不適用。如果webservice開發大並發的應用,webservice依靠web容器提高並發數。