Spring MVC(11):通过 WebSocket 实现前后端全双工通信

Spring WebSocket 支持


通常应用程序之间交换信息会使用如 JMS、AMQP 等技术,但是它们都无法实现浏览器客户端和服务器之间的全双工通信,基于 HTML5 的 WebSocket 协议可以用于实现浏览器和服务器之间的全双工通信;

相对于传统的服务器轮询方式,WebSocket 可以为长连接的建立一个低延迟、全双工、跨域的通信通道,这样的方式更加高效便捷,很适合需要实时通信的场景;

目前浏览器对于 WebSocket 的支持情况如下:
  • IE:10.0(完整支持);
  • FireFox:4.0(部分支持),6.0(完整支持);
  • Chrome:4.0(部分支持),13.0(完整支持);
  • Opera:11.0(部分支持),12.10(完整支持);
  • Safari:5.0(部分支持),12.10(完整支持);
  • IOS Safari:4.2(部分支持),6.0(完整支持);
  • Android Browser:4.4(完整支持);
目前部分服务端对于 WebSocket 的支持情况如下:
  • JavaEE 7.0+
  • Tomcat 8.0+
  • Jetty 7.0+

WebSocket 通信的 URL 是以 “ws://” 或 “wss://” 开头的,分别对应 “http://”,“https://”;

Spring 从 4.0 开始全面支持 WebSocket ,该支持包括以下几个方面:
  • 发送和接收信息的 API;
  • 用于发送信息的模板;
  • 支持 SockJS(用于解决浏览器、服务器及代理不支持 WebSocket 的问题);

在 Spring 中使用 WebSocket 需要导入以下依赖包:
org.springframework:spring-web
org.springframework:spring-webmvc
org.springframework:spring-websocket

以下完整示例代码地址:

Spring MVC WebSocket 程序的实现

Spring MVC 提供了 WebSocketHandler 用于支持 WebSocket 的收发信息API,同时提供一个实现类AbstractWebSocketHandler ,可以继承该类方便地实现一个 WebSocket 服务端控制器,该接口常用地方法如下:
handleTextMessage 处理接收的文本类型消息
handleBinaryMessage 处理接收的二进制类型消息
handlePongMessage 处理接收的Pong类型的消息
handleTransportError 处理接收Exception信息
afterConnectionEstablished 在建立 Websocket 连接后的执行方法
afterConnectionClosed 在关闭 Websocket 连接后的执行方法

示例代码模块(代码地址见上面):
site.assad.web.HelloWebScoketHandler(websocket服务端控制器)
resources/applicationContext.xml(配置文件)
webapp/hello.jsp(websocket客户端)

一个示例的服务端控制器 HelloWebSocketHandler 如下:
 
package site.assad.web;
public class HelloWebSocketHandler extends AbstractWebSocketHandler {
            
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
            
        //处理文本消息
        System.out.println("get message: " + message.getPayload());
        //模拟延时
        Thread.sleep(2000);
        //发送信息
        System.out.println("send message: Hello world!");
        session.sendMessage(new TextMessage("from server: Hello world!"));
    }
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            
        System.out.println("websocket connected");
    }
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus 
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值