spring WebSocket示例详解

 更新时间:2017年01月23日 16:33:09   作者:疯狂的猫  
websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,本篇文章主要介绍了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
@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方法,这是一个核心实现方法,配置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, 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发送消息。

四、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;
  }
}

五、客户端连接

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添加了扩展,例如重连,连接超时时间,失败重连间隔,尝试连接最大次数等。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java之swing单选框用法实例分析

    java之swing单选框用法实例分析

    这篇文章主要介绍了java之swing单选框用法,以实例形式分析了swing图形界面单选框的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • Java实现的properties文件动态修改并自动保存工具类

    Java实现的properties文件动态修改并自动保存工具类

    这篇文章主要介绍了Java实现的properties文件动态修改并自动保存工具类,可实现针对properties配置文件的相关修改与保存功能,需要的朋友可以参考下
    2017-11-11
  • Java用栈实现综合计算器

    Java用栈实现综合计算器

    栈(stack)又名堆栈,它是一种运算受限的线性表,下面看一下如何在Java中,利用数组实现模拟一个栈,感兴趣的朋友跟随小编一起看看吧
    2022-06-06
  • 巧妙的利用Mongodb做地理空间查询

    巧妙的利用Mongodb做地理空间查询

    本篇文章将会以Mongodb为数据库,讲述如何在数据库层级进行定位查询。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java中的UrlDecoder 和 UrlEncoder_动力节点Java学院整理

    Java中的UrlDecoder 和 UrlEncoder_动力节点Java学院整理

    HTML 格式编码的实用工具类。该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。下文通过实例代码给大家介绍Java中的UrlDecoder 和 UrlEncoder知识,感兴趣的的朋友一起看看吧
    2017-07-07
  • Java基于直方图应用的相似图片识别实例

    Java基于直方图应用的相似图片识别实例

    这篇文章主要介绍了Java基于直方图应用的相似图片识别实例,是非常实用的技巧,多见于图形里游戏中,需要的朋友可以参考下
    2014-09-09
  • spring AOP的After增强实现方法实例分析

    spring AOP的After增强实现方法实例分析

    这篇文章主要介绍了spring AOP的After增强实现方法,结合实例形式分析了spring面向切面AOP的After增强实现步骤与相关操作技巧,需要的朋友可以参考下
    2020-01-01
  • Java的Lombok之@Builder使用总结

    Java的Lombok之@Builder使用总结

    这篇文章主要介绍了Java的Lombok之@Builder使用总结,当不使用@Builder注解到类上,创建T1的有参构造函数,入参不仅包括T1中所有的参数,还包括T中所有的参数,T2的属性由T1在有参构造函数中通过调用父类构造器的方式赋初值,需要的朋友可以参考下
    2023-12-12
  • spring Security的自定义用户认证过程详解

    spring Security的自定义用户认证过程详解

    这篇文章主要介绍了spring Security的自定义用户认证过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 亲手教你IDEA2020.3创建Javaweb项目的步骤详解

    亲手教你IDEA2020.3创建Javaweb项目的步骤详解

    这篇文章主要介绍了IDEA2020.3创建Javaweb项目的步骤详解,本文是小编手把手教你,通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-03-03

最新评论