首页前端开发HTMLspring WebSocket的详细介绍

spring WebSocket的详细介绍

时间2024-01-22 23:28:03发布访客分类HTML浏览560
导读:收集整理的这篇文章主要介绍了spring WebSocket的详细介绍,觉得挺不错的,现在分享给大家,也给大家做个参考。场景websocket是HtML5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过...
收集整理的这篇文章主要介绍了spring WebSocket的详细介绍,觉得挺不错的,现在分享给大家,也给大家做个参考。

场景

websocket是HtML5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过多的资源消耗,同时对特殊场景应用提供了全新的实现方式,比如聊天、股票交易、游戏等对对实时性要求较高的行业领域。

背景

在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和XMlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。目前各大主流浏览器都支持websocket,IE浏览器要IE10+

一、POM依赖

POM依赖,sPRing4.1.4.RELEASE,spring核心依赖请自行添加,下面是websocket相关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>
    

二、WebSocket入口

@configuration@EnableWebMvc@EnableWebSocketpublic 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方法,这是一个核心实现方法,配置websocket入口,允许访问的域、注册Handler、SockJs支持和拦截器。

  2. registry.addHandler注册和路由的功能,当客户端发起websocket连接,把/path交给对应的handler处理,而不实现具体的业务逻辑,可以理解为收集和任务分发中心。

  3. setAllowedOrigins(String[] domains),允许指定的域名或IP(含端口号)建立长连接,如果只允许自家域名访问,这里轻松设置。如果不限时使用"*"号,如果指定了域名,则必须要以http或https开头。

  4. addInterceptors,顾名思义就是为handler添加拦截器,可以在调用handler前后加入我们自己的逻辑代码。

  5. spring websocket也支持STOMP协议,下回再分享。

三、拦截器实现

public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
        @Override    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, MapString, 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发送消息。

四、Handler处理类

public class ChatWebSocketHandler extends TextWebSocketHandler{
            private final static ListWebSocketSession>
     sessions = Collections.synchronizedList(new ArrayListWebSocketSession>
    ());
    //接收文本消息,并发送出去    @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,对浏览器自带websocket添加了扩展,例如重连,连接超时时间,失败重连间隔,尝试连接最大次数等。
项目主页:ReconnectingWebSocket

以上就是spring WebSocket的详细介绍的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

springWebSocket

若转载请注明出处: spring WebSocket的详细介绍
本文地址: https://pptw.com/jishu/583505.html
非常不错的svg教程 h5中文件上传下载实例

游客 回复需填写必要信息