spring mvc 4.0 websocket 开发

 
websocket 是html5的新特性。


websocket采用了一种双工信道,底层应该采用了epoll,并发性特别好。

tomcat从7.45以后就开始支持了websocket技术,接下来,我会使用spring4.0自带的websocket开发工具。

HandshakeInterceptor用于拦截,websocket请求
<pre name="code" class="java">package com.front.handler;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;

import javax.servlet.http.HttpSession;
import java.util.Map;

/**
 * Created by zhuqiang on 2015/6/22 0022.
 */
public class HandshakeInterceptor implements org.springframework.web.socket.server.HandshakeInterceptor {

    //进入hander之前的拦截
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
        if (request instanceof ServletServerHttpRequest) {
            ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
            HttpSession session = servletRequest.getServletRequest().getSession(false);
            String userName = "xq";
            if (session != null) {
                //使用userName区分WebSocketHandler,以便定向发送消息
//                String userName = (String) session.getAttribute("WEBSOCKET_USERNAME");
                map.put("WEBSOCKET_USERNAME",userName);
            }
        }
        return true;
    }

    @Override
    public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {

    }
}

 
 

handler用于处理websocket的链接和信息

package com.front.handler;

import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class websockethandler extends TextWebSocketHandler{
    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) {
        //接收到客户端消息时调用
    
    	
    	System.out.println("text message: " + session.getId() + "-" + message.getPayload());

    	
    	
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session)
            throws Exception {
    	
        // 与客户端完成连接后调用
        System.out.println("afterConnectionEstablished");
        System.out.println("getId:" + session.getId());
        System.out.println("getLocalAddress:" + session.getLocalAddress().toString());
        System.out.println("getTextMessageSizeLimit:" + session.getTextMessageSizeLimit());
        System.out.println("getUri:" + session.getUri().toString());
        System.out.println("getPrincipal:" + session.getPrincipal());
        session.sendMessage(new TextMessage("你好".getBytes()));
      //这里加入一个订阅者
    
    }

    @Override
    public void handleTransportError(WebSocketSession session,
            Throwable exception) throws Exception {
        // 消息传输出错时调用
        System.out.println("handleTransportError");
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session,
            CloseStatus closeStatus) throws Exception {
        // 一个客户端连接断开时关闭
        System.out.println("afterConnectionClosed");
    }

    @Override
    public boolean supportsPartialMessages() {
        // TODO Auto-generated method stub
        return false;
    }
}
接下来就该配置路由了,我们可以直接从spring文件里面配置。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xmlns:websocket="http://www.springframework.org/schema/websocket" 
    xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd 
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/websocket 
        http://www.springframework.org/schema/websocket/spring-websocket-4.1.xsd 
        
        ">                    
 
    <!-- scan the package and the sub package -->
    <context:component-scan base-package="com.*"/>
 
   
    <!-- configure the InternalResourceViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
            id="internalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/view" />
        <!-- 后缀 -->
        <property name="suffix" value=".jsp" />
        
        
    </bean>
   
   <!-- websocket消息处理bean -->
<bean id="HelloHandler" class="com.front.handler.websockethandler"/>


<websocket:handlers>
    <!-- 配置消息处理bean和路径的映射关系 -->
    <websocket:mapping path="/connect" handler="HelloHandler"/>
    <!-- 配置握手拦截器 -->
    <websocket:handshake-interceptors>
        <bean class="com.front.handler.HandshakeInterceptor"/>
    </websocket:handshake-interceptors>
    <!-- 开启sockjs,去掉则关闭sockjs -->
   <!--   <websocket:sockjs/> -->
</websocket:handlers>
<!-- 配置websocket消息的最大缓冲区长度 -->

<bean class="org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean">
    <property name="maxTextMessageBufferSize" value="8192"/>
    <property name="maxBinaryMessageBufferSize" value="8192"/>
</bean>
   
    
</beans>

这个时候,websocket的后台就搭建完毕了

猜你喜欢

转载自blog.csdn.net/qq_20949153/article/details/51770076