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

    javax.websocket    javax.websocket-api    1.0    provided    org.springframework    spring-websocket    4.1.4.RELEASE

登录后复制

二、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();    }}

登录后复制

实现WebSocketConfigurer接口,重写registerWebSocketHandlers方法,这是一个核心实现方法,配置websocket入口,允许访问的域、注册Handler、SockJs支持和拦截器。

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

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

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

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

三、拦截器实现

public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {    @Override    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map 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 List sessions = Collections.synchronizedList(new ArrayList());    //接收文本消息,并发送出去    @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的详细介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2910457.html

(0)
上一篇 2025年3月11日 04:33:08
下一篇 2025年2月25日 12:49:42

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 分享webpack实例教程

    webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。 安装 Webpack 在安装 Webpack 前,你本地环境需要支持 node.js。 由于 npm 安装速…

    2025年3月11日 编程技术
    200
  • 认识HTML5的WebSocket

    认识html5的websocket 在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法,从…

    编程技术 2025年3月11日
    200
  • Web页面跳转并取值的方法指导

    这篇文章主要介绍了web前端页面跳转并取到值,就是从a页面跳转到b页面,并将b页面的值取到赋到a页面上显示,具体实现方法,大家参考下本文 记录一下 (从A页面跳转到B页面,并将B页面的值取到赋到A页面上显示) 先来举一个栗子;) 这个是A页…

    2025年3月11日
    400
  • HTML5中WebSocket是什么意思

    一、html5中websocket是什么意思 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在…

    2025年3月11日
    200
  • 浅析微信小程序和web之间的交互(代码分享)

    之前的文章《深入浅析React Native与Web的基本交互(附代码)》中,给大家了解一下React Native与Web交互。下面本篇文章给大家了解一下微信小程序和web之间的交互,有需要的朋友可以参考一下,希望对你们有帮助。 背景 通…

    2025年3月11日
    200
  • 深入解析微信小程序页面中实现的保存图片(附代码)

    之前的文章《浅析微信小程序和web之间的交互(代码分享)》中,给大家了解一下微信小程序和web之间的交互。下面本篇文章给大家了解一下微信小程序页面中实现的保存图片,有需要的朋友可以参考一下,希望对你们有帮助。 背景 在小程序的webview…

    2025年3月11日
    200
  • HTML5 Web Worker的使用实例教程

    web worker是html5提供的一个javascript多线程解决方案,我们可以将一些大计算量的代码交由web worker运行而不冻结用户界面。本文主要介绍了浅谈html5 web worker的使用,小编觉得挺不错的,现在分享给大…

    编程技术 2025年3月11日
    200
  • Webpack的经验分享

    webpack 是一个模块打包器。它的主要目标是将 javascript文件打包在一起,打包后的文件用于在浏览器中使用,但它也能够胜任转换(transform)、打包(bundle)或包裹(package),本文主要和大家分享webpack…

    编程技术 2025年3月10日
    200
  • 详解字体图标制作的方法

    web端为什么需要做字体图标? 性能好。在之前项目中,网页的图标是用的图片,当图标很多时,体积比较大。而且之前做过2年的UI设计,总觉得这样经常切图麻烦,当需要同一个图标大小不一时,直接放大图片会失真。 字体图标制作流程 1:第一当然需要一…

    2025年3月9日 编程技术
    200
  • html中表格form相关的知识讲解(代码示例)

    本篇文章给大家带来的内容是关于html中表格form相关的知识讲解(代码示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在新建浏览器窗口中打开链接 标签在默认的情况下,链接的网页是在当前浏览器窗口中打开,有时候我们…

    编程技术 2025年3月9日
    200

发表回复

登录后才能评论