全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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


# spring  # WebSocket  # websocket详解  # 详解spring boot Websocket使用笔记  # SpringBoot webSocket实现发送广播、点对点消息和Android接收  # 完美解决spring websocket自动断开连接再创建引发的问题  # 详解java WebSocket的实现以及Spring WebSocket  # 详解WebSocket+spring示例demo(已使用sockJs库)  # java WebSocket的实现以及Spring WebSocket示例代码  # Spring整合websocket整合应用示例(下)  # Spring整合WebSocket应用示例(上)  # Spring和Websocket相结合实现消息的推送  # spring框架下websocket的搭建  # 拦截器  # 自己的  # 客户端  # 后处理  # 器中  # 离线  # 将会  # 较高  # 各大  # 这是一个  # 而不  # 较好  # 下回  # 重写  # 较低  # 可以实现  # 顾名思义  # 要以  # 自带  # 用在 


相关文章: 宝塔新建站点为何无法访问?如何排查?  宝塔建站助手安装配置与建站模板使用全流程解析  魔方云NAT建站如何实现端口转发?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  网站制作话术技巧,网站推广做的好怎么话术?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  如何高效完成独享虚拟主机建站?  如何选择靠谱的建站公司加盟品牌?  济南网站制作的价格,历城一职专官方网站?  如何通过云梦建站系统实现SEO快速优化?  如何使用Golang安装API文档生成工具_快速生成接口文档  活动邀请函制作网站有哪些,活动邀请函文案?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  如何通过虚拟主机快速完成网站搭建?  如何通过FTP服务器快速搭建网站?  如何通过VPS建站实现广告与增值服务盈利?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何在VPS电脑上快速搭建网站?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何快速上传建站程序避免常见错误?  建站之星后台密码遗忘?如何快速找回?  建站之星伪静态规则如何正确配置?  平台云上自助建站如何快速打造专业网站?  已有域名和空间如何快速搭建网站?  如何用西部建站助手快速创建专业网站?  制作旅游网站html,怎样注册旅游网站?  建站主机系统SEO优化与智能配置核心关键词操作指南  网站制作软件免费下载安装,有哪些免费下载的软件网站?  中山网站制作网页,中山新生登记系统登记流程?  如何通过商城自助建站源码实现零基础高效建站?  如何用狗爹虚拟主机快速搭建网站?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  内部网站制作流程,如何建立公司内部网站?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  淘宝制作网站有哪些,淘宝网官网主页?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  如何通过山东自助建站平台快速注册域名?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  建站之星下载版如何获取与安装?  如何在Golang中引入测试模块_Golang测试包导入与使用实践 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。