第一步:
我们需要配置一下web.xml文件:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>ContextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>//web容器启动边加载配置
<async-supported>true</async-supported>//异步处理
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
第二步:
我们需要配置一下springmvc.xml文件:我先这个我就不多说了,你都学到这里了,相信spring这些也都很熟悉了
<context:component-scan base-package="com.helei.config"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/webapp/WEB-INF/page"/>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:annotation-driven/>//是对包进行扫描,实现注释驱动Bean定义,同时将bean自动注入容器中使用。即解决了@Controller标识的类的bean的注入和使用。
<mvc:default-servlet-handler/>//就是将我们的静态资源交给servlet容器处理
第三步:
来写我们的SpringwebSocket的配置类需要实现WebSocketConfigurer这个接口
@EnableWebSocket // 声明该类支持WebSocket
public class springSocketConfig implements WebSocketConfigurer {
//在这里我们要注册WebSocket Server 的实现类,这就好比 ServerApplicationConfig,让spring的得到webSocket操作对象
//第一个参数是我们要注册的操作对象,第二个参数是我们访问的地址,也就是类似于之前 serverEndpoint("/helei")
//接下来一个是增加一个拦截器,可以再我们之前做一些过滤处理
registry.addHandler(webSocketEndpoint(), "/text").
addInterceptors(handShakeIntercepter()).setAllowedOrigins("http://localhost:8080");//这里呢是有权限设定,如果你很困扰,如若遇到权限问题,你就 不要setAllowedOrigins,获取你就成功了,倒是后再来加上这句,反复测试,加深理解
registry.addHandler(webSocketEndpoint(), "/sockjs/helei").
addInterceptors(handShakeIntercepter()).withSockJS();
}
/**
* 得到webSocket操作对象
* @return
*/
@Bean
public WebSocketEndpoint webSocketEndpoint()
{
return new WebSocketEndpoint();
}
@Bean
public HandShakeIntercepter handShakeIntercepter()
{
return new HandShakeIntercepter();
}
}
第四步:
如果你想搞个拦截器,哈哈,看这里,我们需要继承一个HttpSessionHandshakeInterceptor这个类
public class HandShakeIntercepter extends HttpSessionHandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception {
// TODO Auto-generated method stub
//这个参数是request, response,wsHandler
//WebSocketHandler这个接口还实现了很多的操作的抽象子类,该对象提供了客户端连接,关闭,错误,发送等方法,重写这几个方法即可实现自定义业务逻辑
//Map<String, Object> attributes 装有webSocketSession设置的属性
System.out.println("握手之前");
return super.beforeHandshake(request, response, wsHandler, attributes);
}
//握手之后
@Override
public void afterHandshake(ServerHttpRequest serverhttprequest, ServerHttpResponse serverhttpresponse,
WebSocketHandler websockethandler, Exception exception) {
// TODO Auto-generated method stub
System.out.println("握手之后");
super.afterHandshake(serverhttprequest, serverhttpresponse, websockethandler, exception);
}
}
public class WebSocketEndpoint extends TextWebSocketHandler {
//在这里还可以实现消息发送,点对点发送等功能 WebSocketSession session会话 textmessage传递过来的信息
@Override
protected void handleTextMessage(WebSocketSession websocketsession, TextMessage textmessage) throws Exception {
// TODO Auto-generated method stub
TextMessage returnMessage=new TextMessage(textmessage.getPayload()+"服务器接收到来自客户端的信息");
System.out.println(returnMessage.toString());
super.handleTextMessage(websocketsession, textmessage);
}
@Override
public void afterConnectionEstablished(WebSocketSession websocketsession) throws Exception {
// TODO Auto-generated method stub
//在这里我们可以创建一个顺序集合来装纳我们的session 会话
System.out.println("开启WebSocket"+websocketsession.getRemoteAddress().toString());
super.afterConnectionEstablished(websocketsession);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
// TODO Auto-generated method stub
System.out.println("连接关闭"+session.getRemoteAddress().toString());
super.afterConnectionClosed(session, status);
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
// TODO Auto-generated method stub
System.out.println(message.getPayload());
TextMessage msg=new TextMessage(message.getPayload()+"服务器收到信息");
session.sendMessage(msg);
super.handleMessage(session, message);
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
// TODO Auto-generated method stub
if(session.isOpen())
{
session.close();
}
System.out.println(exception.toString());
System.out.println("webSocket连接异常");
super.handleTransportError(session, exception);
}
@Override
public boolean supportsPartialMessages() {
// TODO Auto-generated method stub
return false;
}
}