首頁  >  文章  >  Java  >  WebSocket實作Java後台訊息推播的原理與基礎知識

WebSocket實作Java後台訊息推播的原理與基礎知識

php是最好的语言
php是最好的语言原創
2018-08-03 11:35:183027瀏覽

1.什麼是WebSocket

  WebSocket協定是基於TCP的一種新的網路協定。它實作了瀏覽器與伺服器全雙工(full-duplex)通訊-允許伺服器主動傳送訊息給客戶端。

2.實作原理

  在實作websocket連線過程中,需要透過瀏覽器發出websocket連線請求,然後伺服器發出回應,這個過程通常稱為「握手」 。在 WebSocket API,瀏覽器和伺服器只需要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以資料互相傳送。  

3.優點

  在先前的訊息推送機制中,用的都是Ajax 輪詢(polling),在特定的時間間隔由瀏覽器自動發出請求,將伺服器的訊息主動的拉回來,這種方式是非常消耗資源的,因為它本質還是http請求,而且顯得非常笨拙。而WebSocket 在瀏覽器和伺服器完成一個握手的動作,在建立連線之後,伺服器可以主動傳送資料給客戶端,客戶端也可以隨時向伺服器發送資料。

4.WebSocket和Socket的差異

#  1.WebSocket:



    1. ##websocket通訊的建立階段是依賴http協定的。最初的握手階段是http協議,握手完成後就切換到websocket協議,並完全與http協議脫離了。
    2. 建立通訊時,也是由客戶端主動發起連線請求,服務端被動監聽。

    3. 通訊一旦建立連線後,通訊就是「全雙工」模式了。也就是說服務端和客戶端都能在任何時間自由得發送數據,非常適合服務端要主動推送即時數據的業務場景。

    4. 互動模式不再是「請求-應答」模式,完全由開發者自行設計通訊協定。
    5. 通訊的數據是基於「幀(frame)」的,可以傳輸文字數據,也可以直接傳輸二進位數據,效率高。當然,開發者也要考慮封包、拆包、編號等技術細節。
    6.  2.Socket:

#服務端監聽通訊,被動提供服務;客戶端主動向服務端發起連線請求,建立起通訊。

    websocket.close(); 

每一次互動都是:客戶端主動發起請求(request),服務端被動應答(response)。

服務端不能主動向客戶端推送資料。

通訊的資料是基於文字格式的。二進位資料(如圖片等)要利用base64等手段轉換成文字後才能傳輸。

5.WebSocket客戶端:

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 50

51

var websocket = 

null;

var host = document.location.host;  var username = "${loginUsername}"

// 取得目前登入人員的userName #  // alert(username)

//判斷目前瀏覽器是否支援WebSocket # if ('WebSocket' in window) { #     

alert("瀏覽器支援Websocket")

    websocket = new WebSocket('ws://'

host '/mm-dorado/webSocket/'

username); 

### ######} ######else### ###{ ####### ######    ######alert(######'目前瀏覽器 Not support websocket'######) ####### ######} ####### ### ###

//連線發生錯誤的回呼方法 

#

websocket.onerror = function() { 

#

  alert("WebSocket連線發生錯誤")

   setMessageInnerHTML("WebSocket連線發生錯誤"); 

##

};  

   

#

//連線成功建立的回呼方法 

#

websocket.onopen = function() {

  alert("WebSocket連線成功"

   setMessageInnerHTML(#"WebSocket連線成功"); 

#

#

   

#

//接收到訊息的回呼方法 

#

websocket.onmessage = function(event) {

    alert("接收到訊息的回呼方法"

    alert("這是背景推送的訊息:" event.data);

##

     websocket.close();

    alert(

"webSocket已關閉!"

)

#

#   

 

# //連接關閉的回呼方法 

# websocket.onclose = function() { 

    

setMessageInnerHTML("WebSocket連線關閉"

); ##

#   

 

#

//監聽窗口關閉事件,當窗口關閉時,主動去關閉websocket連接,防止連接還沒斷開就關閉窗口,server端會拋異常。 #

window.onbeforeunload = function() { #     

closeWebSocket();  #    # //關機WebSocket連線 

# function closeWebSocket() { 

### ######} ####### ### ### ######//將訊息顯示在網頁上###### ######    ######function setMessageInnerHTML(innerHTML) {###### ######        ######document.getElementById(######'message'######).innerHTML = innerHTML  #######'
' ######;###### ######    ######}###### ### ##########

  6.WebSocket服務端(java後台):

    1.核心類別:

        } 

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

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85
86

87 88

89

90

91 92

93

package

 

com.mes.util;  

import

 

java.io.IOException;# import

 

java.util.Map; import

 

java.util.concurrent.ConcurrentHashMap;  

import javax.websocket.OnClose;

import javax.websocket.OnError;

import javax.websocket.OnMessage;

import javax.websocket.OnOpen;

import

 

javax.websocket.Session; import

 

javax.websocket.server.PathParam; import

 

javax.websocket.server.ServerEndpoint;

  import

 

org.springframework.stereotype.Component;

import org.springframework.stereotype.Service;

  import com.google.gson.JsonObject;#

 

import net.sf.json.JSONObject;# @ServerEndpoint

("/webSocket/{username}")       public class WebSocket { 

#         private static int onlineCount = 0#1

##

        private static 

Map clients = 

#new ##ConcurrentHashMap&T; , WebSocket>();          

private Session session; 

#         private

 

String username; #            #         @OnOpen #         publicvoid onOpen(

#@PathParam#(

#" username") String username, Session session) #throws IOException { 

#        #             

this.username = username; 

############################################################################ ######            ######this######.session = session; ####################################################################################################### ######              ### #### ######            #######addOnlineCount(); #######

            clients.put(使用者名稱, ##this#);#

            System.out.println("連線"#);已#

        

      #

        @OnClose #

        public## void onClose() 拋出IOException { 

 ##. ##             

#clients.remove(使用者名稱);

            

subOnlineCount();

        

      

#         

@OnMessage

 #         public## void onMessage(String message) ## 

IO

##       

#             #JSONObject jsonTo = JSONObject.fromObject(message);

            String mes = (String) jsonTo.get(##"訊息"#);

            所

##》之一之一             if(!jsonTo.get(

#"To").equals(# # 「全部」######)){ #####                 sendMessageTo(mes, jsonTo.get(

#"To"

).toString())); ###########                 sendMessageAll(

#"給擁有者"

#);             

        

      #

        

@OnError 

#

        public## 

void

 onError(會話會話,可拋出錯誤){              error.printStackTrace();

        

      #

        

public## 

void

 sendMessageTo(String message, String To) throws #              // session.getBasicRemote().sendText(message);

             //session.getAsyncRemote().sendText(message);

            for(WebSocket 項目:clients.values()) { 

                if(item.username.equals(To) ) 

(item.username.equals(To) ) 

##################################################################################################################'###### ######                    ######item.session.getAsyncRemote().sendText(message); ######

            

        

          

        public## #void sendMessageAll(String message)  throws#> ##

            

for(WebSocket 項目:clients.values()) { 

                

item.session.getAsyncRemote().sendText(訊息);

            

        

      

#

        

publicstatic synchronized int getOnlineCount() {#o  

getOnlineCount() {#o

#C

            #return

onlineCount;                #

        publicstatic

 

synchronized #void addOnlineCount(

# ### #

            

WebSocket.onlineCount ;

               #

        

publicstatic 

synchronized

 #void ## #             

WebSocket.onlineCount--;

               #         

publicstatic synchronized Map getClients() { 

#             #返回

 

顧客;

}"To",invIO.getIoEmployeeUid());

2.在自己程式碼中的呼叫:

#1
2

3 4 5

WebSocket ws = newWebSocket();

JSONObject jo = newJSONObject();# jo.put(

"message""這是背景回傳的訊息!");

jo.put(

#### ######ws.onMessage(jo.toString());###### ### ##########

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<!-- webSocket 開始-->

#

#

    <groupid>javax.websocket</groupid>

#

    <artifactid>javax.websocket-api</artifactid>

    1.1版本>

    提供範圍>

#

依賴>

#

 

##

#

    <groupid>javax</groupid>

    <artifactid>javaee-api</artifactid>

#

    7.0版本>

    提供範圍>

#

依賴>

#

<!-- webSocket 結束-->

相關文章:

##Java中websocket訊息本體

一個基於WebSocket的WEB訊息本體框架

相關影片:


Websocket影片教學#

以上是WebSocket實作Java後台訊息推播的原理與基礎知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn