spring整合webSocket

项目本基于的平台技术方案spring+mybatis+jersey这一套,在加入webSocket之前,基本通信流程是已经实现好了,项目实现的基本通信的流程是通过NIOServer将服务器接收到的消息发送到activeMQ中,然后通过监听activeMQ出来的消息,获取消息,再基于不同的业务对消息进行各种处理。

刚开始接触到webSocket感觉这个技术挺高端的,实现的时候也费了很多心思,不过我是参考了一个大神的例子,他写了一个最简单的spring整合webSocket的demo,不过他的开发环境是Myeclipse,我用的是IntelliJ IDEA,当然这些只是一些细小的区别,如果是新手想在项目中整合webSocket的话可以先把大神的实例下下来跑一遍。 大神的spring整合webSocket实例

webSocket对环境的要求比较高,我们项目中用的是spring4.0.2+jdk1.7.0-55+tomcat8.0.9。当然环境问题是非常纠结的问题,这里面有很多配置问题,包括spring的配置,web.xml文件的配置。下面介绍下webSocket实现过程。

首先需要客户端发送请求来连接服务器,前台代码:

<span style="FonT-sTYLe: italic">var ws = new WebSocket(“ws://echo.websocket.org”);</span><p><em>ws.onopen = function(){ws.send(“Test!”); };</em></p><p><em>ws.onmessage =function(evt){console.log(evt.data);ws.close();};</em></p><p><em>ws.onclose =function(evt){console.log(“WebSocketClosed!”);};</em></p><p><em>ws.onerror =function(evt){console.log(“WebSocketError!”);};</em></p>
上面的代码中new WebSocket中的url参数指的是需要连接的服务器地址,WebSocket协议采用ws开始类似http协议一样采用http://,当然还有wss://等同于https://;onopen、onmessage、onclose和onerror是为webSocket对象注册消息的处理函数,当浏览器和webSocketServer连接成功以后,会触发onopen消息;如果连接失败,发送、接受数据失败或者处理数据出现错误,浏览器就会触发onerror消息;当浏览器接受到WebSocketServer发送过来的数据时,会触发onmessage消息,参数evt中包含server传输过来的数据;当浏览器接收到WebSocketServer端发送过来的关闭连接请求时会触发onclose消息。所有的操作都是采用消息的方式触发的,所以不会阻塞,使得UI有更快的响应时间,用户体验也大大的提升。

后台握手的就是两个类,貌似基本都是这样的:

public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {

    @Override
    public boolean beforeHandshake(ServerHttpRequest request,
                                   ServerHttpResponse response, WebSocketHandler wsHandler,
                                   Map<String, Object> attributes) throws Exception {
        System.out.println("Before Handshake");
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }

    @Override
    public void afterHandshake(ServerHttpRequest request,
                               ServerHttpResponse response, WebSocketHandler wsHandler,
                               Exception ex) {
        System.out.println("After Handshake");
        super.afterHandshake(request, response, wsHandler, ex);
    }
}
另一个很重要的类就是写一个继承TextWebSocketHandler的类,这个类里面提供了重写的方法:

重写其中afterConnectionEstablished方法建立连接,服务器会生成一个session来唯一标识建立的这个通道,重写其中的afterConnectionClosed关闭通道,重写handleTextMessage来处理从客户端传过来的参数,参数Session就指的是服务器给通道创建的标识,里面包含类似于id一样的值,参数message指的就是客户端传递过来的请求参数。
完成了这些,基本的WebSocket通道应该就建立了吧,服务器推送数据就调用session的sendMessage方法,参数必须是TextMessage类型,这样就能实现通过WebSocket传送实时数据。
关于多个客户端建立通道所造成的并发问题,下一篇文章中会介绍下自己处理的解决方案。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值