Spring Chapter4 WebSocket 胡乱翻译 (一) 一个例子
因为没有基础,不知道从哪里入手。
文档里的例子,https://github.com/rstoyanchev/spring-websocket-portfolio,这个除了WebSocket,还整了Security的东西(坑,版本更新导致默认的passwordEncoder不能用了,不然login一直不成功)
自己写了个乞丐版,体验一下到底怎么运行起来的。
要做啥
客户端:HTML,请求建立连接,显示接收到的消息
服务端:SpringBoot的WebSocket starter,每隔0.5秒发送一个数字
实现
客户端:
<!DOCTYPE html>
<html> <head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>Test WebSocket</title>
<script>
var ws = new WebSocket("ws://localhost:8080/myHandler"); ws.onopen = function () {
var ele=document.getElementById('wsStatus');
ele.innerHTML="WebSocket状态:已连接";
};
// 接收服务端数据时触发事件
ws.onmessage = function (evt) {
var received_msg = evt.data;
console.info(received_msg);
var ele=document.getElementById('countId');
ele.innerHTML="接收到:"+received_msg;
}; // 断开 web socket 连接成功触发事件
ws.onclose = function () {
var ele=document.getElementById('wsStatus');
ele.innerHTML="WebSocket状态:已断开";
};
</script>
</head> <body>
<div>
<h2 id="wsStatus">WebSocket状态:</h2>
</div>
<div >
<h2 id="countId">接收到:</h2>
</div>
</body> </html>
服务端:
1. 从start.spring.io上生成一个初始的Gradle项目,依赖项加入WebSocket。
2. 根据4.2.1, 添加一个handler,每500ms发送一个数字。
package com.fzh.sbootwebsocket.handlers; import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler; public class MyHandler extends TextWebSocketHandler{
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message){
System.out.println("session:"+session.getId()+", Message: "+message.getPayload());
} @Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception { for(int i=0;i<100;i++){
TextMessage message = new TextMessage(String.valueOf(i));
session.sendMessage(message);
Thread.sleep(500);
} }
}
3. 将handler配置到路径/myHandler。注意,setAllowedOrigins("*")这个一定要加上,要不然客户端没有响应。
package com.fzh.sbootwebsocket.config; import com.fzh.sbootwebsocket.handlers.MyHandler; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
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
public class WebSocketConfig implements WebSocketConfigurer { @Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myHandler(), "/myHandler").setAllowedOrigins("*");
} @Bean
public WebSocketHandler myHandler(){
return new MyHandler();
} }
4. 命令行输入: ./gradlew bootRun
5. 用浏览器打开最开始编辑好的网页,当当当当当!
Spring Chapter4 WebSocket 胡乱翻译 (一) 一个例子的更多相关文章
- Spring Chapter4 WebSocket 胡乱翻译 (二)
书接上文,Spring Chapter4 WebSocket 胡乱翻译 (一) 4.4.4. 消息流 一旦暴露了STOMP端点,Spring应用程序就成为连接客户端的STOMP代理. 本节介绍服务器端 ...
- Spring Chapter4 WebSocket 胡乱翻译 (一)
4. WebSocket 包含了Servlet stack,原生WebSocket交互,通过SockJS模拟,并且通过STOMP在WebSocket之上订阅.发布消息. 4.1 简介 不扯了,看到这个 ...
- spring 上传文件文件的一个例子,
/** * 类名称:UploadTest 类描述:创建人:zhang 创建时间:2015年3月13日 下午4:20:57 修改人:zhang * 修改时间:2015年3月13日 下午4:20:57 修 ...
- 什么是基于Java的Spring注解配置? 给一些注解的例子?
基于Java的配置,允许你在少量的 Java注解 的帮助下,进行你的大部分Spring配置而非通过XML文件. 以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Sp ...
- 什么是基于 Java 的 Spring 注解配置? 给一些注解的例子?
基于 Java 的配置,允许你在少量的 Java 注解的帮助下,进行你的大部分 Spring 配置而非通过 XML 文件. 以@Configuration 注解为例,它用来标记类可以当做一个 bean ...
- spring笔记--使用springAPI以及自定义类 实现AOP的一个例子
Spring的另一个重要思想是AOP,面向切面的编程,它提供了一种机制,可以在执行业务前后执行另外的代码,Servlet中的Filter就是一种AOP思想的体现,下面通过一个例子来感受一下. 假设我们 ...
- Spring Boot WebSocket从入门到放弃
在构建Spring boot项目时已经提供webSocket依赖的勾选.webSocket是TCP之上的一个非常薄的轻量级层 ,webSocket主要的应用场景离不开即时通讯与消息推送,但只要应用程序 ...
- 玩转spring boot——websocket
前言 QQ这类即时通讯工具多数是以桌面应用的方式存在.在没有websocket出现之前,如果开发一个网页版的即时通讯应用,则需要定时刷新页面或定时调用ajax请求,这无疑会加大服务器的负载和增加了客户 ...
- spring boot websocket stomp 实现广播通信和一对一通信聊天
一.前言 玩.net的时候,在asp.net下有一个叫 SignalR 的框架,可以在ASP .NET的Web项目中实现实时通信.刚接触java寻找相关替代品,发现 java 体系中有一套基于stom ...
随机推荐
- php代码审计2全局变量和超全局变量
全局变量:就是在函数外面定义的变量,不能在函数中直接使用,因为它的作用域不会到函数内部,所以在函数内部使用的时候尝尝看到类似global $a; 超全局变量:在所有脚本都有效,所以,在函数可以直接使用 ...
- UML之时序图详解
原文链接:https://blog.csdn.net/fly_zxy/article/details/80911942 什么是时序图 时序图(Sequence Diagram),又名序列图.循序图,是 ...
- 【BZOJ3417】[POI2013]MOR-Tales of seafaring (最短路SPFA)
[POI2013]MOR-Tales of seafaring 题目描述 一个n点m边无向图,边权均为1,有k个询问 每次询问给出(s,t,d),要求回答是否存在一条从s到t的路径,长度为d 路径不必 ...
- leetcode-229.求众数(二)
题目: 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 说明: 要求算法的时间复杂度为O(n),空间复杂度为O(1). 示例 1: 输入: [3,2,3] 输出: [3 ...
- js 三大家族之offset
JS中的offset家族: 一.offsetWidth与offsetHeight: 获取的是元素的实际宽高 = width + border + padding 注意点: 1.可以获取行内及内嵌的宽高 ...
- Python之freshman02
内置方法:https://docs.python.org/3/library/functions.html?highlight=built#abs 一.数学运算 1.abs()-取绝对值 2.divm ...
- uiautomator中文输入
步骤一: 下载UTF7 IME的整个项目 https://github.com/sumio/uiautomator-unicode-input-helper 选择“Download ZIP”打包下载 ...
- hibernate自动生成时报错问题
创建好了实体类和.hbm.xml文件,运行项目报上错: 实体类和xml文件中的字段要一致.(顺序和字段)
- ubuntu 18.04 修改 固定ip
Linux(ubuntu)下固定IP的方法 写在前面,问:为什么要固定ip.答:要知道固定IP的好处多多,随意搬动,固定共享地址,不怕断网等等 首先,我们要选取一个局域网内的IP,方法如下: 1. ...
- php 对象方式传入参数
类是单例模式,对象方式传入参数,如果参数过多是,使用形参容易混乱 class Object { /** * 基本配置信息 * @var array */ private $config = array ...