场景

websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过多的资源消耗,同时对特殊场景应用提供了全新的实现方式,比如聊天、股票交易、游戏等对对实时性要求较高的行业领域。
背景
在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。目前各大主流浏览器都支持websocket,IE浏览器要IE10+
一、POM依赖
POM依赖,spring4.1.4.RELEASE,spring核心依赖请自行添加,下面是websocket相关jar
<dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>4.1.4.RELEASE</version> </dependency>
二、WebSocket入口
@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
//允许连接的域,只能以http或https开头
String[] allowsOrigins = {"http://www.xxx.com"};
//WebIM WebSocket通道
registry.addHandler(chatWebSocketHandler(),"/ webSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor());
registry.addHandler(chatWebSocketHandler(), "/sockjs/w ebSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()).withSockJS();
}
@Bean
public ChatWebSocketHandler chatWebSocketHandler() {
return new ChatWebSocketHandler();
}
@Bean
public WebSocketHandshakeInterceptor myInterceptor(){
return new WebSocketHandshakeInterceptor();
}
}
1.实现WebSocketConfigurer接口,重写registerWebSocketHandlers方法,这是一个核心实现方法,配置websocket入口,允许访问的域、注册Handler、SockJs支持和拦截器。
2.registry.addHandler注册和路由的功能,当客户端发起websocket连接,把/path交给对应的handler处理,而不实现具体的业务逻辑,可以理解为收集和任务分发中心。
3.setAllowedOrigins(String[] domains),允许指定的域名或IP(含端口号)建立长连接,如果只允许自家域名访问,这里轻松设置。如果不限时使用"*"号,如果指定了域名,则必须要以http或https开头。
4.addInterceptors,顾名思义就是为handler添加拦截器,可以在调用handler前后加入我们自己的逻辑代码。
5.spring websocket也支持STOMP协议,下回再分享。
三、拦截器实现
public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object
> attributes) throws Exception {
if (request instanceof ServletServerHttpRequest) {
attributes.put("username",userName);
}
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
}
}
beforeHandshake,在调用handler前处理方法。常用在注册用户信息,绑定WebSocketSession,在handler里根据用户信息获取WebSocketSession发送消息。
四、Handler处理类
public class ChatWebSocketHandler extends TextWebSocketHandler{
private final static List<WebSocketSession> sessions = Collections.synchronizedList(new ArrayList<WebSocketSession>());
//接收文本消息,并发送出去
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
chatTextMessageHandler(message.getPayload());
super.handleTextMessage(session, message);
}
//连接建立后处理
@SuppressWarnings("unchecked")
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
logger.debug("connect to the websocket chat success......");
sessions.add(session);
//处理离线消息
}
//抛出异常时处理
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
if(session.isOpen()){
session.close();
}
logger.debug("websocket chat connection closed......");
sessions.remove(session);
}
//连接关闭后处理
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
logger.debug("websocket chat connection closed......");
sessions.remove(session);
}
@Override
public boolean supportsPartialMessages() {
return false;
}
}
五、客户端连接
var host = window.location.host;
var websocket;
if ('WebSocket' in window) {
websocket = new ReconnectingWebSocket("ws://"
+ host + "/webSocketIMServer", null, {debug:true, maxReconnectAttempts:4});
} else if ('MozWebSocket' in window) {
websocket = new MozWebSocket("ws://" + host
+ "/webSocketIMServer");
} else {
websocket = new SockJS("http://" + host
+ "/sockjs/webSocketIMServer");
}
websocket.onopen = function(evnt) {
console.log("websocket连接上");
};
websocket.onmessage = function(evnt) {
messageHandler(evnt.data);
};
websocket.onerror = function(evnt) {
console.log("websocket错误");
};
websocket.onclose = function(evnt) {
console.log("websocket关闭");
}
这里用到了ReconnectingWebSocket.js,对浏览器自带websocket添加了扩展,例如重连,连接超时时间,失败重连间隔,尝试连接最大次数等。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# WebSocket
# websocket详解
# 详解spring boot Websocket使用笔记
# SpringBoot webSocket实现发送广播、点对点消息和Android接收
# 完美解决spring websocket自动断开连接再创建引发的问题
# 详解java WebSocket的实现以及Spring WebSocket
# 详解WebSocket+spring示例demo(已使用sockJs库)
# java WebSocket的实现以及Spring WebSocket示例代码
# Spring整合websocket整合应用示例(下)
# Spring整合WebSocket应用示例(上)
# Spring和Websocket相结合实现消息的推送
# spring框架下websocket的搭建
# 拦截器
# 自己的
# 客户端
# 后处理
# 器中
# 离线
# 将会
# 较高
# 各大
# 这是一个
# 而不
# 较好
# 下回
# 重写
# 较低
# 可以实现
# 顾名思义
# 要以
# 自带
# 用在
相关文章:
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
TestNG的testng.xml配置文件怎么写
如何配置FTP站点权限与安全设置?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
建站主机核心功能解析:服务器选择与网站搭建流程指南
建站之星如何保障用户数据免受黑客入侵?
平台云上自助建站如何快速打造专业网站?
实例解析angularjs的filter过滤器
建站之星好吗?新手能否轻松上手建站?
C++中引用和指针有什么区别?(代码说明)
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
已有域名能否直接搭建网站?
攀枝花网站建设,攀枝花营业执照网上怎么年审?
php json中文编码为null的解决办法
家庭建站与云服务器建站,如何选择更优?
如何在云主机快速搭建网站站点?
如何通过可视化优化提升建站效果?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
C#怎么使用委托和事件 C# delegate与event编程方法
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
如何选择香港主机高效搭建外贸独立站?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
如何通过虚拟主机快速搭建个人网站?
专业网站建设制作报价,网页设计制作要考什么证?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
建站VPS推荐:2025年高性能服务器配置指南
c# await 一个已经完成的Task会发生什么
已有域名和空间如何搭建网站?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
存储型VPS适合搭建中小型网站吗?
网站制作公司排行榜,四大门户网站排名?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
seo网站制作优化,网站SEO优化步骤有哪些?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
建站上市公司网站建设方案与SEO优化服务定制指南
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
建站主机与服务器功能差异如何区分?
南京网站制作费用,南京远驱官方网站?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
建站之星安装步骤有哪些常见问题?
网站企业制作流程,用什么语言做企业网站比较好?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
平台云上自主建站:模板化设计与智能工具打造高效网站
如何设计高效校园网站?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
如何挑选最适合建站的高性能VPS主机?
网页设计网站制作软件,microsoft office哪个可以创建网页?
*请认真填写需求信息,我们会在24小时内与您取得联系。