WebSoket的简单用法
第一步,在客户端配置
<script>
var websocket;
if ('WebSocket' in window) {
websocket = new WebSocket('ws://127.0.0.1:8080/websocket');//配置Websocket服务器端地址
} else {
alert("你的浏览器暂不支持websocket,请更换其他浏览器再试");
} websocket.onopen = function (event) {
console.log("建立连接");
};
websocket.onclose = function (event) {
console.log("关闭连接");
};
websocket.onmessage = function (event) {
console.log("收到消息," + event.data);
// 弹窗提示与播放提示音乐
var msg = event.data;
if (msg === "秒杀已结束") {
$('#seckill-box').html("秒杀结束");
}
};
websocket.onerror = function (event) {
console.log("websocket异常");
};
/**
* readyState状态如下:
* CONNECTING:值为0,表示正在连接;
OPEN:值为1,表示连接成功,可以通信了;
CLOSING:值为2,表示连接正在关闭;
CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
*/ // 向服务端发送消息(必须为open状态时可发送)
if (websocket.readyState === 1) {
websocket.send("服务端你好");
} </script>
第二步,在服务端配置
@Configuration
public class WebSocketConfig { @Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
} }
@ServerEndpoint("/websocket")
@Component
@Slf4j
public class WebSocketService {
/**
* 记录当前websocket的连接数(保证线程安全)
*/
private static LongAdder connectAccount = new LongAdder();
/**
*存放每个客户端对应的websocketServer对象(需保证线程安全)
*/
private static CopyOnWriteArraySet<WebSocketService> webSocketSet = new CopyOnWriteArraySet<>();
/**
* 与客户端的连接对象
*/
private Session session;
/**
* 连接成功调用的方法
* @param session
*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
webSocketSet.add(this);
connectAccount.increment();
log.info("有新的连接接入,当前连接数为{}", connectAccount);
}
/**
* 连接关闭时调用
*/
@OnClose
public void onClose() {
webSocketSet.remove(this);
connectAccount.decrement();
log.info("有连接关闭,当前连接数为{}", connectAccount);
}
/**
* 收到客户端消息时调用
* @param message
*/
@OnMessage
public void onMessage(String message) {
log.info("收到客户端发来的消息,message -> {}", message);
}
/**
* 服务端向客户端发送消息
* @param message
*/
public void sendMessage(String message) {
for (WebSocketService webSocketService : webSocketSet) {
try {
log.info("【websocket消息】 广播消息, message={}", message);
webSocketService.session.getBasicRemote().sendText(message);
} catch (IOException e) {
log.info("向客户端发送消息失败, {}", e.getMessage());
}
}
}
}
之后就可以在你需要推送消息的地方调用WebSocketService服务了。
WebSoket的简单用法的更多相关文章
- CATransition(os开发之画面切换) 的简单用法
CATransition 的简单用法 //引进CATransition 时要添加包“QuartzCore.framework”,然后引进“#import <QuartzCore/QuartzCo ...
- jquery.validate.js 表单验证简单用法
引入jquery.validate.js插件以及Jquery,在最后加上这个插件的方法名来引用.$('form').validate(); <!DOCTYPE html PUBLIC " ...
- NSCharacterSet 简单用法
NSCharacterSet 简单用法 NSCharacterSet其实是许多字符或者数字或者符号的组合,在网络处理的时候会用到 NSMutableCharacterSet *base = [NSMu ...
- [转]Valgrind简单用法
[转]Valgrind简单用法 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian S ...
- Oracle的substr函数简单用法
substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H' *从字符串第一个字符开始截取长度为1的字符串 subst ...
- Ext.Net学习笔记19:Ext.Net FormPanel 简单用法
Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...
- TransactionScope简单用法
记录TransactionScope简单用法,示例如下: void Test() { using (TransactionScope scope = new TransactionScope()) { ...
- WPF之Treeview控件简单用法
TreeView:表示显示在树结构中分层数据具有项目可展开和折叠的控件 TreeView 的内容是可以包含丰富内容的 TreeViewItem 控件,如 Button 和 Image 控件.TreeV ...
- listActivity和ExpandableListActivity的简单用法
http://www.cnblogs.com/limingblogs/archive/2011/10/09/2204866.html 今天自己简单的总结了listActivity和Expandable ...
随机推荐
- Ubuntu13.04编译安装cmake2.8.12.2
前提: 安装过程需要gcc和gcc-c++.ubuntu13.04桌面版自带gcc4.7,apt-get install g++4.7安装g++./usr/bin目录下有x86_64-linux-gn ...
- sql server 字符串拆分
最近项目调取存储的时候直接传入string 作为in的查询范围,结果报错了,深思之后才发现,数据库对于传进来的String,并不是我们想的直接可以作为参数,而是作为一个整体,而in是需要一个类似arr ...
- Private Variable
Any variable defined inside a function is considered private since it is inaccessable outside that f ...
- centos6.5安装mysql报错
安装完mysql后,mysql服务无法打开. 报错 查看mysql日志 执行命令:less /var/log/mysqld.log 发现是权限不够,不能创建pid文件.因此改变权限,再次启动服务 问 ...
- ARM汇编指令特点
根据朱有鹏老师课程笔记整理而来: (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器 ...
- pandas的.columns和.index
可以通过.columns和.index着两个属性返回数据集的列索引和行索引 设data是pandas的一个DataFram类型的数据集. 则data.index返回一个index类型的行索引列表,da ...
- windows如何使用bat快速安装计划任务?
关键词:windows定时任务,schtasks,at ,bat schtasks 部分转自: https://www.cnblogs.com/yumianhu/p/3710743.html at的详 ...
- Java 架构师面试题
基础题目 Java线程的状态 进程和线程的区别,进程间如何通讯,线程间如何通讯 HashMap的数据结构是什么?如何实现的.和HashTable,ConcurrentHashMap的区别 Cookie ...
- for (;;) 与 while (true),哪个更快?
Java技术栈 www.javastack.cn 优秀的Java技术公众号 在 JDK8u 的 jdk 项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk ...
- 初识JavaScript(二)
初识JavaScript(二) 我从上一篇<初识JavaScript(一)>知道和认识JavaScript的词法结构,也开始慢慢接触到了JavaScript的使用方法,是必须按照JavaS ...