Websocket은 Html5의 새로운 기능 중 하나입니다. 그 목적은 브라우저와 서버 간의 전이중 통신 방법을 설정하고, http 요청-응답으로 인한 과도한 리소스 소비를 해결하는 동시에 채팅, 주식 거래, 게임 및 기타 높은 실시간 성능이 필요한 산업과 같은 특수 시나리오 응용 프로그램에 대한 새로운 솔루션을 제공합니다.
브라우저에서는 http를 통해서만 단방향 통신이 가능합니다. Comet은 어느 정도 양방향 통신을 시뮬레이션할 수 있지만 효율성이 낮고 서버의 소켓과 xmlsocket의 좋은 지원이 필요합니다. flash 실제 양방향 통신이 가능합니다. flex ajax 브리지를 통해 이 두 기능을 javascript에서 사용할 수 있습니다. 일단 웹소켓이 브라우저에 구현되면 위의 두 기술을 대체하고 널리 사용될 것으로 예상됩니다. 이러한 상황에 직면하여 HTML5는 서버 리소스와 대역폭을 더 잘 절약하고 실시간 통신을 달성할 수 있는 WebSocket 프로토콜을 정의합니다. 현재 모든 주요 주류 브라우저는 websocket을 지원합니다. IE browser는 IE10+
POM 종속성, spring4.1.4.RELEASE, 다음은 websocket 관련 jars
<dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>4.1.4.RELEASE</version> </dependency>를 직접 추가하세요.
@Configuration @EnableWebMvc @EnableWebSocket public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { //允许连接的域,只能以http或https开头 String[] allowsOrigins = {"http://www.xxx.com"}; //WebIM WebSocket通道 registry.addHandler(chatWebSocketHandler(),"/ webSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()); registry.addHandler(chatWebSocketHandler(), "/sockjs/w ebSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()).withSockJS(); } @Bean public ChatWebSocketHandler chatWebSocketHandler() { return new ChatWebSocketHandler(); } @Bean public WebSocketHandshakeInterceptor myInterceptor(){ return new WebSocketHandshakeInterceptor(); } }
WebSocketConfigurer 인터페이스를 구현하고 RegisterWebSocketHandlers 메소드를 재정의합니다. 이는 웹소켓 입구, 허용된 액세스 도메인, 등록된 핸들러, SockJs 지원 및 인터셉터를 구성하는 핵심 구현 방법입니다.
registry.addHandler에는 클라이언트가 웹소켓 연결을 시작할 때 특정 비즈니스 로직을 구현하지 않고 처리를 위해 해당 핸들러로 전달되는 /path가 수집 및 작업 분산 센터로 이해될 수 있습니다.
setAllowedOrigins(String[] domains)는 지정된 도메인 이름 또는 IP(포트 번호 포함)가 긴 연결을 설정하도록 허용합니다. 자신의 도메인 이름에 대한 액세스만 허용하는 경우 여기에서 쉽게 설정할 수 있습니다. "*" 기호를 시간 제한 없이 사용할 경우 도메인 이름을 지정할 경우 http 또는 https로 시작해야 합니다.
addInterceptors는 이름에서 알 수 있듯이 핸들러에 인터셉터를 추가하는 것입니다. 핸들러 호출 전후에 자체 논리 코드를 추가할 수 있습니다.
spring websocket은 STOMP 프로토콜도 지원하는데, 다음에 공유하겠습니다.
public class WebSocketHandshakeInterceptor implements HandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object > attributes) throws Exception { if (request instanceof ServletServerHttpRequest) { attributes.put("username",userName); } return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { } }
beforeHandshake, 핸들러 호출 전 처리 방법. 핸들러에서 사용자 정보를 등록하고 WebSocketSession을 바인딩하고 사용자 정보를 기반으로 WebSocketSession을 얻어 메시지를 보내는 데 흔히 사용됩니다.
public class ChatWebSocketHandler extends TextWebSocketHandler{ private final static List<WebSocketSession> sessions = Collections.synchronizedList(new ArrayList<WebSocketSession>()); //接收文本消息,并发送出去 @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { chatTextMessageHandler(message.getPayload()); super.handleTextMessage(session, message); } //连接建立后处理 @SuppressWarnings("unchecked") @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { logger.debug("connect to the websocket chat success......"); sessions.add(session); //处理离线消息 } //抛出异常时处理 @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { if(session.isOpen()){ session.close(); } logger.debug("websocket chat connection closed......"); sessions.remove(session); } //连接关闭后处理 @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { logger.debug("websocket chat connection closed......"); sessions.remove(session); } @Override public boolean supportsPartialMessages() { return false; } }
var host = window.location.host; var websocket; if ('WebSocket' in window) { websocket = new ReconnectingWebSocket("ws://" + host + "/webSocketIMServer", null, {debug:true, maxReconnectAttempts:4}); } else if ('MozWebSocket' in window) { websocket = new MozWebSocket("ws://" + host + "/webSocketIMServer"); } else { websocket = new SockJS("http://" + host + "/sockjs/webSocketIMServer"); } websocket.onopen = function(evnt) { console.log("websocket连接上"); }; websocket.onmessage = function(evnt) { messageHandler(evnt.data); }; websocket.onerror = function(evnt) { console.log("websocket错误"); }; websocket.onclose = function(evnt) { console.log("websocket关闭"); }
ReconnectingWebSocket.js를 사용하며 브라우저 자체 웹소켓에 재연결, 연결 시간 초과, 재연결 간격 실패 등의 확장 기능을 추가합니다. 횟수 등
프로젝트 홈페이지:ReconnectingWebSocket
위 내용은 Spring WebSocket에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!