En avril 2014, ce site avait étudié de manière approfondie la technologie HTML5 et présentait l'exemple HTML5 WebSocket. L'API de la spécification Servlet3.0 utilisée à l'époque nécessitait le support de Tomcat7 (il semble que WebSocket ait également été ajouté dans la version de maintenance ultérieure de Tomcat6. support), dès le début, cet exemple était encore une fonction spéciale de ce site, et de nombreuses personnes sont venues me demander le code source. Après de nombreuses années, j'ai utilisé l'architecture SpringBoot pour expérimenter l'implémentation de WebSocket intégré. Après quelques informations, j'ai probablement trouvé deux façons d'y parvenir. Je les ai pratiquées séparément, donc j'appelle ces deux façons la version intégrée du JDK. Et Spring version du paquet.
1. Version intégrée du JDK
Utilisez principalement les annotations sous le package javax.websocket pour l'intégration, y compris principalement : ServerEndpoint, OnOpen, OnMessage, OnClose, les classes liées à OnError et les annotations à intégrer, globalement relativement simples, toutes sont déclarées en fonction des méthodes définies par les annotations, reportez-vous à As indiqué dans le code suivant :
JdkWebSocket
package cn.chendd.websocket.jdk;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
/**
* websocket实现
*
* @date 2023/6/2 21:02
*/
@Component
@ServerEndpoint(value = "/websocket/jdk")
public class JdkWebSocket {
@OnOpen
public void onOpen(Session session) {
System.out.println("WebSocketConfig.onOpen");
}
@OnMessage
public void onMessage(Session session , String message) {
System.out.println("WebSocketConfig.onMessage-->" + session + "--->" + message);
}
@OnClose
public void onClose() {
System.out.println("WebSocketConfig.onClose");
}
@OnError
public void onError(Session sesison , Throwable throwable) {
System.out.println("WebSocketConfig.onError-->" + sesison + "--->" + throwable);
}
}
JdkWebSocketConfig
package cn.chendd.websocket.jdk;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* @author chendd
* @date 2023/6/2 21:15
*/
@Configuration
public class JdkWebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
résultat de l'opération
2. Version pack printemps
La version du package Spring encapsule le type de message et fournit une API WebSocket plus complète, qui mérite une analyse approfondie.
SpringWebSocketHandler
package cn.chendd.websocket.spring;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.*;
import org.springframework.web.socket.handler.TextWebSocketHandler;
/**
* SpringWebSocketHandler
*
* @author chendd
* @date 2023/6/2 22:08
*/
@Component
public class SpringWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
super.afterConnectionEstablished(session);
System.out.println("SpringWebSocketHandler.afterConnectionEstablished");
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
super.handleMessage(session, message);
System.out.println("SpringWebSocketHandler.handleMessage");
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
super.handleTextMessage(session, message);
System.out.println("SpringWebSocketHandler.handleTextMessage");
}
@Override
protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
super.handlePongMessage(session, message);
System.out.println("SpringWebSocketHandler.handlePongMessage");
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
super.handleTransportError(session, exception);
System.out.println("SpringWebSocketHandler.handleTransportError");
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
super.afterConnectionClosed(session, status);
System.out.println("SpringWebSocketHandler.afterConnectionClosed");
}
@Override
public boolean supportsPartialMessages() {
System.out.println("SpringWebSocketHandler.supportsPartialMessages");
return super.supportsPartialMessages();
}
}
SpringWebSocketConfig
package cn.chendd.websocket.spring;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import javax.annotation.Resource;
/**
* SpringWebSocketConfig
*
* @author chendd
* @date 2023/6/2 22:11
*/
@Configuration
@EnableWebSocket
public class SpringWebSocketConfig implements WebSocketConfigurer {
@Resource
private SpringWebSocketHandler springWebSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(springWebSocketHandler , "/websocket/spring").setAllowedOrigins("*");
}
}
résultat de l'opération
3. Autres consignes
(1) Cet exemple se concentre sur l'exemple de code Java côté serveur. Aucun exemple frontal n'est écrit. Vous pouvez vous référer à l'intégration HTML frontale dans le code source du projet ci-dessous, ou utiliser l'adresse de la page du test WebSocket en ligne. utilisé dans cet exemple pour la vérification en ligne , le clic droit pour afficher son code source est également le code pertinent de la spécification native HTML5 ;
(2) La version intégrée de JDK et la version packagée de Spring sont fournies. Je recommande personnellement d'utiliser la version packagée de Spring. Après tout, les annotations de JDK ne sont pas assez claires pour décrire les paramètres spécifiques de la méthode annotée, et la version packagée de Spring a un type de message.encapsulation;
(3) Le code est relativement simple, combiné avec le code complet du précédent " Devinez le mini programme que vous choisissez " est également inclus, la structure du package de code est la suivante :
(4) Le code source complet est visible : le texte original