1. 程式人生 > >WebService和Socket的比較

WebService和Socket的比較

 一、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遠端通訊

     image

1.客戶端

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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.服務端

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

/*

 * 天氣服務端

 */

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

image

WeatherInterfaceImpl.java

image

WeatherServer.java

image

 

2.檢視wsdl

a: 在位址列輸入(注意後面的引數?wsdl)

http://127.0.0.1:12345/weather?wsdl

b: Wsdl不是webService,只是獲取一個用於描述WebService的說明檔案

 

image

 

3.使用wsimport工具生成客戶端呼叫程式碼

image

image

 

4.編寫客戶端

第1步:建立服務檢視物件。

第2步: 從服務檢視中獲得PortType物件。

第3步: 呼叫PortType的方法(可以實現遠端通訊)

第4步: 接收方法的返回值(服務端響應的結果)。

image

 

四、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容器提高併發數。