第一步,在客户端配置

<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的简单用法的更多相关文章

  1. CATransition(os开发之画面切换) 的简单用法

    CATransition 的简单用法 //引进CATransition 时要添加包“QuartzCore.framework”,然后引进“#import <QuartzCore/QuartzCo ...

  2. jquery.validate.js 表单验证简单用法

    引入jquery.validate.js插件以及Jquery,在最后加上这个插件的方法名来引用.$('form').validate(); <!DOCTYPE html PUBLIC " ...

  3. NSCharacterSet 简单用法

    NSCharacterSet 简单用法 NSCharacterSet其实是许多字符或者数字或者符号的组合,在网络处理的时候会用到 NSMutableCharacterSet *base = [NSMu ...

  4. [转]Valgrind简单用法

    [转]Valgrind简单用法 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian S ...

  5. Oracle的substr函数简单用法

    substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串 subst ...

  6. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  7. TransactionScope简单用法

    记录TransactionScope简单用法,示例如下: void Test() { using (TransactionScope scope = new TransactionScope()) { ...

  8. WPF之Treeview控件简单用法

    TreeView:表示显示在树结构中分层数据具有项目可展开和折叠的控件 TreeView 的内容是可以包含丰富内容的 TreeViewItem 控件,如 Button 和 Image 控件.TreeV ...

  9. listActivity和ExpandableListActivity的简单用法

    http://www.cnblogs.com/limingblogs/archive/2011/10/09/2204866.html 今天自己简单的总结了listActivity和Expandable ...

随机推荐

  1. ForkJoin使用

    一.Fork Join 分而治之的办法 JDk为Fork/Join框架提供了很好的支持,我们想要用这个算法首先得创建一个Fork/Join任务,在JDK中这个任务就叫做:ForJoinTask,只要继 ...

  2. redis源码分析之数据结构--dictionary

    本文不讲hash算法,而主要是分析redis中的dict数据结构的特性--分步rehash. 首先看下数据结构:dict代表数据字典,每个数据字典有两个哈希表dictht,哈希表采用链式存储. typ ...

  3. shell脚本判断端口是否打开

    [root@www zabbix_scripts]# cat check_httpd.sh #!/bin/bash a=`lsof -i: | wc -l` " ];then " ...

  4. [转] 浅谈JS中的变量及作用域

    Situation One <script> var i; function sayHello() { var x=100; alert(x); x++; } sayHello();   ...

  5. java:LeakFilling(Spring)

    1.配置文件总结: bean节点: id:用户自定义名称,用于标识当前对象,可以通过getBean(String id)从容器中获取该对象. class:要交给spring容器创建的对象的全类名(包名 ...

  6. JMeter接口测试印象篇(win10)

    参考博文1:https://www.cnblogs.com/suim1218/p/9257369.html 参考博文2:https://blog.csdn.net/u011541946/article ...

  7. 【HANA系列】SAP HANA行列转换

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA行列转换   前 ...

  8. 【Deep Learning Nanodegree Foundation笔记】第 7 课:NEURAL NETWORKS Intro to Neural Networks

    In this lesson, you'll dive deeper into the intuition behind Logistic Regression and Neural Networks ...

  9. token防爆破?

    先尝试例如删除token  猜token的值等操作 不行就burp抓包 选择Pitchfork模式.选择要爆破的参数 线程设置为1显然只有获取上一个请求返回的taken值才能,做下一次请求 点击Ref ...

  10. 【VS开发】使用WinPcap编程(4)——把网络数据包存储到一个文件中

    这里用到的数据结构是pcap_dumper_t,这也是一个相当于文件描述符的东西,我们在用的时候先指定pcap_dumper_t *dumpfp; 使用两个函数来存储网络数据,一个是pcap_dump ...