Heim > Java > javaLernprogramm > Hauptteil

Wie SpringBoot WebSocket integriert, um dem Backend das Senden von Nachrichten an das Frontend zu ermöglichen

WBOY
Freigeben: 2023-05-11 14:07:12
nach vorne
4255 Leute haben es durchsucht

1. Was ist die Websocket-Schnittstelle

Verwenden Sie Websocket, um eine lange Verbindung herzustellen. Der Server und der Client können aktiv miteinander kommunizieren Schieben Sie sie an den Kunden.

WebSocket vereinfacht den Datenaustausch zwischen dem Client und dem Server und ermöglicht es dem Server, Daten aktiv an den Client zu übertragen. In der WebSocket-API müssen der Browser und der Server lediglich einen Handshake durchführen, und für die bidirektionale Datenübertragung kann direkt eine dauerhafte Verbindung zwischen beiden hergestellt werden.
In der WebSocket-API müssen der Browser und der Server nur 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.

2. Anwendbare Szenarien

Während des Geschäftsentwicklungsprozesses stießen wir auf einige asynchrone Verarbeitung (Zahlungsbenachrichtigungen für WeChat-Zahlung und Alipay-Zahlung) und anwendungsübergreifende Nachrichtenübermittlung.

Nachdem die Geschäftsabwicklung abgeschlossen ist, müssen erfolgreiche Informationen an das Frontend geliefert werden. Unter normalen Umständen ruft das Front-End die http/https-Schnittstelle des Back-Ends auf, um Daten abzurufen. Wenn das Back-End aktiv Nachrichten an das Front-End senden möchte, muss es WebSocket für die Kommunikation zwischen Front-End und Back-End verwenden.

3. Beispielcode

3.1. Pom.xml-Abhängigkeit hinzufügen

<!-- websocket-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
Nach dem Login kopieren

3.2. WebSokcet-Konfigurationsklasse erstellen

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}
3.3、创建WebSokcet工具类
 
@ServerEndpoint(value = "/websocket")
@Component
public class WebSocketServer {
    private final static Logger log = LoggerFactory.getLogger(WebSocketServer.class);
 
    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;
    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
    private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
 
    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;
 
    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        //加入set中
        webSocketSet.add(this);
        //在线数加1
        addOnlineCount();
        log.info("有新连接加入!当前在线人数为" + getOnlineCount());
        try {
            MsgResponseVo userMsgResponseVo = new MsgResponseVo();
            userMsgResponseVo.setMsg("SUCCESS");
            WebSocketServer.sendInfo(JSON.toJSONString(userMsgResponseVo));
        } catch (IOException e) {
            log.error("websocket IO异常");
        }
    }
 
    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        //从set中删除
        webSocketSet.remove(this);
        //在线数减1
        subOnlineCount();
        log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
    }
 
    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("来自客户端的消息:" + message);
 
        //群发消息
        for (WebSocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误");
        error.printStackTrace();
    }
 
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }
 
    /**
     * 群发自定义消息
     */
    public static void sendInfo(String message) throws IOException {
        log.info(message);
        for (WebSocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                continue;
            }
        }
    }
 
    public static synchronized int getOnlineCount() {
        return onlineCount;
    }
 
    public static synchronized void addOnlineCount() {
        WebSocketServer.onlineCount++;
    }
 
    public static synchronized void subOnlineCount() {
        WebSocketServer.onlineCount--;
    }
}
Nach dem Login kopieren
#🎜🎜 #3.3. Erstellen Sie eine Testschnittstelle zum Senden von Nachrichten :/ /127.0.0.1:8080/websocket)

3.5 Das Front-End verwendet WebSocket, um die Back-End-WebSocket-Adresse zu überwachen und auszuführen Der nächste Schritt der Geschäftsabwicklung nach Erhalt der Nachricht.

Das obige ist der detaillierte Inhalt vonWie SpringBoot WebSocket integriert, um dem Backend das Senden von Nachrichten an das Frontend zu ermöglichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage