Spring Boot SockJS应用例子
1.SockJS用javascript实现的socket连接,兼容各种浏览器的WebSocket支持库
2.WebSocket是H5的,不支持H5的浏览器没法使用。
3.SockJS它提供类似于websocket的编程模式但是可以适应不同的浏览器(包括不支持websocket的浏览器)。
后端代码:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-websocket</artifactId>
- </dependency>
- package com.cesmart;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.annotation.ComponentScan;
- @EnableAutoConfiguration
- @ComponentScan(basePackages = "com.cesmart") // 扫描那些包得到bean.@ComponentScan({"com.teradata.notification","com.teradata.dal"})
- public class Application {
- public static void main(String[] args) {
- ApplicationContext applicationContext = SpringApplication.run(Application.class, args);
- }
- }
- package com.cesmart.config;
- import org.springframework.web.socket.CloseStatus;
- import org.springframework.web.socket.TextMessage;
- import org.springframework.web.socket.WebSocketHandler;
- import org.springframework.web.socket.WebSocketMessage;
- import org.springframework.web.socket.WebSocketSession;
- public class MyHandler implements WebSocketHandler {
- // 连接继开处理
- @Override
- public void afterConnectionClosed(WebSocketSession arg0, CloseStatus arg1) throws Exception {
- // TODO Auto-generated method stub
- System.out.println("Connection closed..." + arg0.getRemoteAddress().toString());
- }
- // 连接建立处理
- @Override
- public void afterConnectionEstablished(WebSocketSession arg0) throws Exception {
- // TODO Auto-generated method stub
- System.out.println("Connection established..." + arg0.getRemoteAddress().toString());
- }
- // 接收、发送信息处理
- @Override
- public void handleMessage(WebSocketSession arg0, WebSocketMessage<?> arg1) throws Exception {
- // TODO Auto-generated method stub
- try {
- System.out.println("Req: " + arg1.getPayload());
- // 发送信息
- TextMessage returnMessage = new TextMessage(arg1.getPayload() + " received at server");
- arg0.sendMessage(returnMessage);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- // 错误处理(客户端突然关闭等接收到的错误)
- @Override
- public void handleTransportError(WebSocketSession arg0, Throwable arg1) throws Exception {
- // TODO Auto-generated method stub
- if (arg0.isOpen()) {
- arg0.close();
- }
- System.out.println(arg1.toString());
- System.out.println("WS connection error,close...");
- }
- @Override
- public boolean supportsPartialMessages() {
- // TODO Auto-generated method stub
- return false;
- }
- }
- package com.cesmart.config;
- import java.util.Map;
- import org.springframework.http.server.ServerHttpRequest;
- import org.springframework.http.server.ServerHttpResponse;
- import org.springframework.web.socket.WebSocketHandler;
- import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
- /**
- * 类描述:拦截器
- */
- public class MyHandshakeInterceptor extends HttpSessionHandshakeInterceptor {
- @Override
- public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
- Exception ex) {
- // TODO Auto-generated method stub
- System.out.println("After handshake " + request.getRemoteAddress().toString());
- super.afterHandshake(request, response, wsHandler, ex);
- }
- @Override
- public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler,
- Map<String, Object> map) throws Exception {
- // TODO Auto-generated method stub
- System.out.println("Before handshake " + request.getRemoteAddress().toString());
- return super.beforeHandshake(request, response, handler, map);
- }
- }
- package com.cesmart.config;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.socket.config.annotation.EnableWebSocket;
- import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
- import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
- @Configuration // 配置类
- @EnableWebSocket // 声明支持websocket
- public class WebSocketConfig implements WebSocketConfigurer {
- @Override
- public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
- // 注册websocket实现类,指定参数访问地址;allowed-origins="*" 允许跨域
- // addHandler是增加处理接口和设定URL
- // addInterceptors是增加拦截器处理(可以不用)
- registry.addHandler(myHandler(), "/ws").addInterceptors(myHandshake()).setAllowedOrigins("*");
- registry.addHandler(myHandler(), "/sockjs/ws").addInterceptors(myHandshake()).withSockJS();
- registry.addHandler(myHandler(), "/ws2").setAllowedOrigins("*");
- registry.addHandler(myHandler(), "/sockjs/ws2").setAllowedOrigins("*").withSockJS();
- }
- @Bean
- public MyHandler myHandler() {
- return new MyHandler();
- }
- @Bean
- public MyHandshakeInterceptor myHandshake() {
- return new MyHandshakeInterceptor();
- }
- }
前端代码:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>Insert title here</title>
- <script type="text/javascript" src="//cdn.bootcss.com/sockjs-client/1.1.1/sockjs.min.js"></script>
- <script type="text/javascript">
- var url = "127.0.0.1:8090/";
- var websocket = null;
- if ('WebSocket' in window) {
- websocket = new WebSocket("ws://" + url + "/ws");//建立连接
- } else {
- websocket = new SockJS("http://" + url + "/sockjs/ws");//建立连接
- }
- //建立连接处理
- websocket.onopen = onOpen;
- //接收处理
- websocket.onmessage = onMessage;
- //错误处理
- websocket.onerror = onError;
- //断开连接处理
- websocket.onclose = onClose;
- function onOpen(openEvent) {
- document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ "OPEN<br/>";
- }
- function onMessage(event) {
- document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ event.data+"<br/>";
- }
- function onError() {
- }
- function onClose() {
- document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ "CLOSE<br/>";
- }
- function doSend() {
- console.log(websocket.readyState);
- if (websocket.readyState == SockJS.OPEN) {
- var msg = document.getElementById("message").value;
- //发送消息
- websocket.send(msg);
- } else {
- alert("连接失败!");
- }
- }
- function disconnect(){
- if (websocket != null) {
- websocket.close();
- websocket = null;
- }
- }
- function reconnect(){
- if (websocket != null) {
- websocket.close();
- websocket = null;
- }
- if ('WebSocket' in window) {
- websocket = new WebSocket("ws://" + url + "/ws");
- } else {
- websocket = new SockJS("http://" + url + "/sockjs/ws");
- }
- websocket.onopen = onOpen;
- websocket.onmessage = onMessage;
- websocket.onerror = onError;
- websocket.onclose = onClose;
- }
- </script>
- </head>
- <body>
- <div>
- <button id="disconnect" onclick="disconnect()">断开连接</button>
- <button id="send" onclick="doSend()">发送消息</button>
- <button id="reconnect" onclick="reconnect()">重新连接</button>
- </div>
- <div>
- <textarea id="message" style="width: 350px">Here is a message!</textarea>
- </div>
- <div>日志信息:</div>
- <p id="console" width="600px"></p>
- </body>
- </html>
参考(websocket简单应用):http://wiselyman.iteye.com/blog/2003336
参考(应用例子):http://768992698.iteye.com/blog/2338250
参考(应用例子(TextWebSocketHandler )):http://www.cnblogs.com/likun10579/p/5594828.html
Spring Boot SockJS应用例子的更多相关文章
- Spring Boot SOAP Webservice例子
前言 本文将学习如何利用Spring boot快速创建SOAP webservice服务: 虽然目前REST和微服务越来越流行,但是SOAP在某些情况下,仍然有它的用武之地: 在本篇 spring b ...
- Spring Boot 2 + Redis例子
Redis是一个key-value数据库,支持存储的value类型包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).在 ...
- spring boot 微服务例子一
package com.example.hello.demo; import org.springframework.boot.SpringApplication;import org.springf ...
- spring boot整合JWT例子
application.properties jwt.expire_time=3600000 jwt.secret=MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjY34DFDSS ...
- Spring Boot之Hello World
Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...
- spring boot面试问题集锦
译文作者:david 原文链接:https://www.javainuse.com/spring/SpringBootInterviewQuestions Q: 什么是spring boot? A: ...
- 1.Spring Boot入门及其jar包依赖模型分析
Spring Boot介绍 Spring Boot是由Pivotal团队提供的新框架,其设计目的是简化Spring应用的搭建以及开发过程.其目标是: 为所有Spring开发提供一个从根本上更快,且方便 ...
- spring boot整合mybatis+mybatis-plus
Spring boot对于我来说是一个刚接触的新东西,学习过程中,发现这东西还是很容易上手的,Spring boot没配置时会默认使用Spring data jpa,这东西可以说一个极简洁的工具,可是 ...
- 面试那点小事,你从未见过的spring boot面试集锦(附详细答案)
一, 什么是spring boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问页面https://spring.io/projects,我们将看到所有在应用程序中使用的不同功能的 ...
随机推荐
- 玩转CONSUL(3)–大规模部署的性能开销定量分析
1. 引言 今天有朋友问萌叔,consul能否在大规模生产环境下进行应用.场景是总计大约10w+台机器,分为3 ~ 4个机房,单个机房最多3w万+机器.这个问题大的,可把萌叔吓了跳,部门里面consu ...
- MySQL 中的共享锁和排他锁的用法
在 MySQL 中的行级锁.表级锁和页级锁中,咱们介绍过,行级锁是 MySQL 中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁和排他锁的概 ...
- vxlan 跨网段虚拟机迁移
一些服务器虚拟化软件可实现在两台虚拟化的物理服务器之间对虚拟机做动态迁移,迁移至另一中心的虚拟机不仅保留原有IP地址,而且还保持迁移前的运行状态(如TCP会话状态),所以必须将涉及虚拟机,迁移的物理服 ...
- Linux下创建Oracle19C的数据库实例
接上一篇博客,安装 Oracle19chttps://www.cnblogs.com/xuzhaoyang/p/11264557.html 切换到root用户下,切换目录到db_1,执行,遇到选择路径 ...
- php中的__get和__set方法
1.__get() 作用:当实例化对象调用一个没有定义的属性时,会自动调用__get()方法 当实例化对象调用一个私有或者受保护的属性时,也会调用这个方法,方式类似 结果是:你访问的公开属性:name ...
- golang 实现定时任务
在实际开发过程中,我们有时候需要编写一些定时任务.当然我们可以使用crontab命令实现我们的需求.但是这种方法不满足一些定制化场景,同时会依赖具体的操作系统环境. 定时任务 在golang中我们可以 ...
- Mysql中HAVING的相关使用方法
having字句可以让我们筛选分组之后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前. 而having子句在聚合后对组记录进行筛选.我的理解就是真实表 ...
- TeX 家族(TeX, pdfTeX, XeTeX, LuaTeX, LaTeX, pdfLaTeX, XeLaTeX …)
TeX 家族 带有 TeX 的词,仅仅是本文就已经提到了 TeX, LaTeX, XeLaTeX.通常中国学生面对不了解意思的一群形近单词,都会有一种「本能的恐惧」(笑~).因此,「大神们」在为新手介 ...
- C# CheckBoxList绑定值,设置及获取
前端页面:.aspx <asp:CheckBoxList ID="ckbdot" runat="server" RepeatDirection=" ...
- (二) Windows 进行 Docker CE 安装(Docker Desktop)
参考并感谢 官方文档: https://docs.docker.com/docker-for-windows/install/ 下载地址 https://download.docker.com/win ...