spring WebSocket 예제 상세 정보
웹소켓은 Html5의 새로운 증가 특성 중 하나로 브라우저와 서비스 측이 쌍방향 통신 방식을 구축하여 http 요청-응답으로 인해 과도한 자원 소모를 해결하는 동시에 특수 장면 응용에 새로운 실현 방식을 제공했다. 예를 들어 채팅, 주식 거래, 게임 등 실시간성에 대한 요구가 비교적 높은 업계 분야이다.
배경
브라우저에서 http를 통해 단방향 통신만 실현할 수 있고comet은 어느 정도 양방향 통신을 모의할 수 있으나 효율이 낮고 서버가 비교적 좋은 지원을 필요로 한다.flash의 socket과 xmlsocket는 진정한 양방향 통신을 실현할 수 있으며, flex ajaxbridge를 통해javascript에서 이 두 가지 기능을 사용할 수 있습니다.웹소켓이 브라우저에서 실현되면 상기 두 가지 기술을 대체하여 광범위하게 사용될 것으로 예상된다.이러한 상황에 직면하여 HTML5는 웹 소켓 프로토콜을 정의하여 서버 자원과 대역폭을 더욱 절약하고 실시간 통신에 도달할 수 있도록 한다.현재 각 주요 브라우저는 웹소켓을 지원하고 있으며, IE 브라우저는 IE10+
1. POM 의존성
POM 의존, spring 4.1.4.RELEASE,spring 핵심 의존 자체 추가, 다음은 웹소켓 관련jar
<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>
2. WebSocket 포털
@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();
}
}
1. WebSocketConfigurer 인터페이스를 실현하고registerWebSocketHandlers 방법을 다시 쓴다. 이것은 핵심 실현 방법이다. 웹socket 입구를 설정하고 접근할 수 있는 영역, 등록 Handler, SockJs 지원과 차단기를 설정한다.2.registry.ddHandler 등록과 루트의 기능은 클라이언트가 웹socket 연결을 시작하면/path를 대응하는 handler 처리에 맡기고 구체적인 업무 논리를 실현하지 않으면 수집과 임무 분배 센터로 이해할 수 있다.
3.setAllowed Origins(String[]domains), 지정한 도메인 이름이나 IP (포트 번호 포함) 의 긴 연결을 허용합니다. 만약 자신의 도메인 이름만 접근할 수 있다면 쉽게 설정할 수 있습니다."*"번호를 한정적으로 사용하지 않으면 도메인 이름을 지정하면 http 또는 https로 시작해야 합니다.
4.addInterceptors는 말 그대로 Handler에 차단기를 추가하는 것입니다. Handler를 호출하기 전에 우리의 논리 코드를 추가할 수 있습니다.
5.spring websocket도 STOMP 프로토콜을 지원하고 다음에 공유합니다.
3. 차단기 구현
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,handler를 호출하기 전에 처리 방법입니다.사용자 정보를 등록하고 WebSocketSession을 귀속시키며handler에서 사용자 정보에 따라 WebSocketSession을 가져와 메시지를 보냅니다.4. Handler 처리 클래스
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;
}
}
5. 클라이언트 연결
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 ");
}
여기에는 Reconnecting WebSocket이 사용됩니다.js, 브라우저 자체 웹소켓에 확장을 추가했습니다. 예를 들어 재연결, 연결 시간 초과, 실패 재연결 간격, 연결 시도 최대 횟수 등입니다.이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.