分享

springmvc+websocket 简单实现消息即时推送

 _超级赛亚人_ 2016-08-10
1、HandshakeInterceptor 类实现握手,获取session中的登陆用户信息,用以区分WebSocketSession,对指定用户进行推送信息。可使用WebSocketSession对象获取对应的用户:session.getAttributes().get( "username" )
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {
    @Override
    public boolean beforeHandshake( ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Map<String, Object> attributes ) throws Exception {
        // 获取登录用户
        if ( request instanceof ServletServerHttpRequest ) {
            ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
            HttpSession session = servletRequest.getServletRequest().getSession( false );
            if ( session != null ) {
                // 使用userName区分WebSocketHandler,以便定向发送消息
                String username = (String) session.getAttribute( "username" );
                attributes.put( "username", username );
            }
        }
        return true;
    }

    @Override
    public void afterHandshake( ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex ) {  }}
2、MyWebSocketHandler类:消息处理类,需要实现WebSocketHandler接口。定义静态变量users集合,记录当前登录用户的WebSocketSession信息。


public class WebsocketEndPoint implements WebSocketHandler {

    private static final ArrayList<WebSocketSession> users;

    static {
        users = new ArrayList<WebSocketSession>();
    }

    @Override
    public void afterConnectionEstablished( WebSocketSession session ) throws Exception {
        users.add( session );
        String username = (String) session.getAttributes().get( "username" );
        System.out.println( username + "登陆成功" );
    }

    @Override
    public void handleMessage( WebSocketSession session, WebSocketMessage<?> message ) throws Exception {
        // TODO Auto-generated method stub
        System.out.println( "接收到用户:" + (String) session.getAttributes().get( "username" ) + " 发送的信息:"
            + message.getPayload().toString() );
        sendMessageToUser( "dave", new TextMessage( (String) session.getAttributes().get( "username" ) + "发送给您:"
            + message.getPayload() ) );
    }

    @Override
    public void handleTransportError( WebSocketSession session, Throwable exception ) throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterConnectionClosed( WebSocketSession session, CloseStatus closeStatus ) throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean supportsPartialMessages() {
        // TODO Auto-generated method stub
        return false;
    }

    public void sendMessageToUser( String username, TextMessage message ) throws IOException {
        for ( WebSocketSession user : users ) {
            if ( username.equals( user.getAttributes().get( "username" ) ) ) {
                user.sendMessage( message );
            }
        }
    }
}
3、springmvc配置文件
<bean id="websocket" class="com.websocket.websocket.MyWebSocketHandler"/>  
<websocket:handlers>
   <websocket:mapping path="/ws" handler="websocket"/>  
   <websocket:handshake-interceptors>  
   <bean class="com.websocket.websocket.HandshakeInterceptor"/>  
   </websocket:handshake-interceptors>  
</websocket:handlers>
4、html页面:
//判断当前浏览器是否支持websocket
if('WebSocket' in window){
websocket = new WebSocket("ws://localhost:8080/wesocket/ws");
}else{
alert("non-support");
}
  //连接发生错误
websocket.onerror = function(){
alert("error connect");
};
//连接成功
websocket.onopen = function(){
alert("open connnect");
};
//接收到的消息
websocket.onmessage = function(event){
alert(event.data);
};
//连接关闭
websocket.onclose = function(){
alert("close");
websocket.close();
};
  })
 
  //发送消息
  $("#sendBtn").click(function(){
  websocket.send("我是admin用户");
  })

资料参考网址:
http://www.cnblogs.com/winkey4986/p/5478332.html
http://www./posts/view/21

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多