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的后台就搭建完毕了
相关文章推荐
- ssh整合(上)
- Java继承执行顺序
- 使用spring cache和ehcache之前必须了解的
- javaweb学习总结(十四)——JSP原理
- 模仿hibernate一级缓存session缓存机制
- Java中对象的三种状态
- Java Enum
- java字符串数学公式运算
- [改善Java代码]不要在finally块中处理返回值
- 伪共享和缓存行填充,从Java 6, Java 7 到Java 8
- Java和.NET下socket转换错误记录
- 常用Java的搜索引擎框架
- Java 读 Txt 返回 String
- 深入学习理解java:CompletionService解决ExecutorService的submit方法的缺点
- Java垃圾回收(Garbage Collection, GC)机制
- Spring中使用Jcaptcha实现校验码验证
- JavaWeb学习总结(十三)——使用Session防止表单重复提交
- 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程
- JavaWeb学习总结(十二)——Session
- javaweb学习总结(十一)——使用Cookie进行会话管理