您的位置:首页 > 编程语言 > Java开发

spring mvc 4.0 websocket 开发

2016-06-27 17:58 465 查看
 

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的后台就搭建完毕了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: