Heim  >  Artikel  >  Java  >  Die Prinzipien und Grundkenntnisse von WebSocket zur Implementierung von Java Background Message Push

Die Prinzipien und Grundkenntnisse von WebSocket zur Implementierung von Java Background Message Push

php是最好的语言
php是最好的语言Original
2018-08-03 11:35:183143Durchsuche

1. Was ist WebSocket

Das WebSocket-Protokoll ist ein neues Netzwerkprotokoll, das auf TCP basiert. Es implementiert eine Vollduplex-Kommunikation zwischen dem Browser und dem Server, sodass der Server proaktiv Informationen an den Client senden kann.

2. Implementierungsprinzip

Bei der Implementierung einer WebSocket-Verbindung muss eine WebSocket-Verbindungsanforderung über den Browser gesendet werden, und dann sendet der Server eine Antwort „Handschlag“. In der WebSocket-API müssen der Browser und der Server lediglich eine Handshake-Aktion ausführen, und dann wird ein schneller Kanal zwischen dem Browser und dem Server gebildet. Daten können direkt zwischen beiden übertragen werden.

3. Vorteile

Im vorherigen Nachrichten-Push-Mechanismus wurde Ajax-Polling verwendet und der Browser sendete in bestimmten Zeitintervallen automatisch Anfragen Die Methode verbraucht viele Ressourcen, da es sich im Wesentlichen um eine HTTP-Anfrage handelt und ist sehr unhandlich. WebSocket führt einen Handshake zwischen dem Browser und dem Server durch. Nachdem die Verbindung hergestellt wurde, kann der Server aktiv Daten an den Client übertragen, und der Client kann jederzeit Daten an den Server senden.

4. Der Unterschied zwischen WebSocket und Socket

1.WebSocket:

    1. Die Einrichtungsphase der Websocket-Kommunikation basiert auf dem http-Protokoll. Die erste Handshake-Phase ist das http-Protokoll. Nach Abschluss des Handshakes wird auf das Websocket-Protokoll umgestellt und vollständig vom http-Protokoll getrennt.

    2. Beim Kommunikationsaufbau initiiert der Client aktiv eine Verbindungsanfrage und der Server lauscht passiv.

    3. Sobald die Kommunikationsverbindung hergestellt ist, erfolgt die Kommunikation im „Vollduplex“-Modus. Mit anderen Worten, sowohl der Server als auch der Client können jederzeit Daten frei senden, was sich sehr gut für Geschäftsszenarien eignet, in denen der Server aktiv Echtzeitdaten pushen möchte.
    4. Der Interaktionsmodus ist nicht mehr der „Anfrage-Antwort“-Modus und das Kommunikationsprotokoll wird vollständig vom Entwickler entworfen.
    5. Die Kommunikationsdaten basieren auf einem „Frame“, der Textdaten oder Binärdaten direkt und mit hoher Effizienz übertragen kann. Natürlich müssen Entwickler auch technische Details wie Verpackung, Auspacken und Nummerierung berücksichtigen.
    6.  2.Socket:
    7. Der Server überwacht die Kommunikation und stellt passiv Dienste bereit; der Client initiiert aktiv eine Verbindungsanfrage an den Server , Kommunikation ist hergestellt.

    8. Jede Interaktion ist: Der Client initiiert aktiv eine Anfrage (Anfrage) und der Server antwortet passiv (Antwort).

    9. Der Server kann Daten nicht aktiv an den Client übertragen.
    10. Die übermittelten Daten basieren auf dem Textformat. Binärdaten (z. B. Bilder usw.) müssen vor der Übertragung mithilfe von Base64 und anderen Mitteln in Text umgewandelt werden.

5. WebSocket-Client:

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() { 

    websocket.close(); 

 

//将消息显示在网页上

    function setMessageInnerHTML(innerHTML) {

        document.getElementById('message').innerHTML += innerHTML + '<br/>';

    }

6. WebSocket-Server (Java-Hintergrund):

1. Kernklasse:

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

        private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>(); 

        private Session session; 

        private String username; 

          

        @OnOpen

        public void onOpen(@PathParam("username") String username, Session session) throws IOException { 

      

            this.username = username; 

            this.session = session; 

              

            addOnlineCount(); 

            clients.put(username, this);

            System.out.println("已连接");

        

       

        @OnClose 

        public void onClose() throws IOException { 

            clients.remove(username); 

            subOnlineCount(); 

        

       

        @OnMessage 

        public void onMessage(String message) throws IOException { 

       

            JSONObject jsonTo = JSONObject.fromObject(message); 

            String mes = (String) jsonTo.get("message");

             

            if (!jsonTo.get("To").equals("All")){ 

                sendMessageTo(mes, jsonTo.get("To").toString()); 

            }else

                sendMessageAll("给所有人"); 

            

        

       

        @OnError 

        public void onError(Session session, Throwable error) { 

            error.printStackTrace(); 

        

       

        public void sendMessageTo(String message, String To) throws IOException { 

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

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

            for (WebSocket item : clients.values()) { 

                if (item.username.equals(To) ) 

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

            

        

          

        public void sendMessageAll(String message) throws IOException { 

            for (WebSocket item : clients.values()) { 

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

            

        

      

        public static synchronized int getOnlineCount() { 

            return onlineCount; 

        

      

        public static synchronized void addOnlineCount() { 

            WebSocket.onlineCount++; 

        

      

        public static synchronized void subOnlineCount() { 

            WebSocket.onlineCount--; 

        

      

        public static synchronized Map<String, WebSocket> getClients() { 

            return clients; 

        

}

 2. Rufen Sie Ihren eigenen Code auf:

1

2

3

4

5

WebSocket ws = new WebSocket();

JSONObject jo = new JSONObject();

jo.put("message""这是后台返回的消息!");

jo.put("To",invIO.getIoEmployeeUid());

ws.onMessage(jo.toString());

1 2 3 4 5
WebSocket ws = new WebSocket(); JSONObject jo = new JSONObject(); jo.put("message", "Dies ist die vom Hintergrund zurückgegebene Nachricht!" ); jo.put("To",invIO.getIoEmployeeUid()); ws.onMessage(jo.toString());

  7.所需maven依赖:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<!-- webSocket 开始-->

<dependency>

    <groupId>javax.websocket</groupId>

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

    <version>1.1</version>

    <scope>provided</scope>

</dependency>

 

<dependency>

    <groupId>javax</groupId>

    <artifactId>javaee-api</artifactId>

    <version>7.0</version>

    <scope>provided</scope>

</dependency>

<!-- webSocket 结束-->

1

2 3

4 5

6

7

8

9 10 11 12 13 14 15
<!-- webSocket 开始--> <dependency>     <groupId>javax.websocket</groupId>     <artifactId>javax.websocket-api</artifactId>     <version>1.1</version>     <scope>provided</scope> </dependency>   <dependency>     <groupId>javax</groupId>     <artifactId>javaee-api</artifactId>     <version>7.0</version>     <scope>provided</scope> </dependency> <!-- webSocket 结束-->
相关文章:Java中websocket消息推送一个基于WebSocket的WEB消息推送框架相关视频:Websocket视频教程

Das obige ist der detaillierte Inhalt vonDie Prinzipien und Grundkenntnisse von WebSocket zur Implementierung von Java Background Message Push. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn