内容简介:新建一个spring-boot项目,不多说,可以用IDEA或者在netty-socketio 可以去github上找最新的版本这个服务有点问题,每次重启spring-boot项目的时候,这个服务不能及时关闭,关闭spring-boot项目的web服务后,等个几秒再启动即可,如果立即启动会报socket 端口被占用的异常
引入依赖
新建一个spring-boot项目,不多说,可以用IDEA或者在 start.spring.io
上创建 spring-boot 项目
netty-socketio 可以去github上找最新的版本 https://github.com/mrniko/netty-socketio
<dependency> <groupId>com.corundumstudio.socketio</groupId> <artifactId>netty-socketio</artifactId> <version>1.7.7</version> </dependency>
配置Socket
@org.springframework.context.annotation.Configuration
public class SocketConfig {
@Bean
public SocketIOServer socketIOServer() {
Configuration config = new Configuration();
config.setHostname(siteConfig.getSocket().getHostname());
config.setPort(siteConfig.getSocket().getPort());
// 协议升级超时时间(毫秒),默认10000。HTTP握手升级为ws协议超时时间
config.setUpgradeTimeout(10000);
// Ping消息间隔(毫秒),默认25000。客户端向服务器发送一条心跳消息间隔
config.setPingInterval(25000);
// Ping消息超时时间(毫秒),默认60000,这个时间间隔内没有接收到心跳消息就会发送超时事件
config.setPingTimeout(60000);
// 握手协议参数使用JWT的Token认证方案
// config.setAuthorizationListener(data -> {
// 可以使用如下代码获取用户密码信息
// String token = data.getSingleUrlParam("token");
// return true;
// });
return new SocketIOServer(config);
}
@Bean
public SpringAnnotationScanner springAnnotationScanner(SocketIOServer socketServer) {
return new SpringAnnotationScanner(socketServer);
}
}
创建启动服务类
@Component
@Order(1)
public class SocketServerRunner implements CommandLineRunner {
@Autowired
private SocketIOServer server;
@Override
public void run(String... args) {
server.start();
}
}
这个服务有点问题,每次重启spring-boot项目的时候,这个服务不能及时关闭,关闭spring-boot项目的web服务后,等个几秒再启动即可,如果立即启动会报socket 端口被占用的异常
创建事件handler
@Component
public class SocketEventHandler {
private Map<String, Object> socketMap = new HashMap<>();
private Logger logger = LoggerFactory.getLogger(SocketEventHandler.class);
@Autowired
private SocketIOServer server;
@OnConnect
public void onConnect(SocketIOClient client) {
String username = client.getHandshakeData().getSingleUrlParam("username");
logger.info("用户{}上线了, sessionId: {}", username, client.getSessionId().toString());
socketMap.put(username, client);
// notification count
long count = 10; // 这一步可以通过调用service来查数据库拿到真实数据
Map<String, Object> map = new HashMap<>();
map.put("count", count);
client.sendEvent("notification", map);
}
@OnDisconnect
public void onDisConnect(SocketIOClient client) {
String[] username = new String[1];
socketMap.forEach((key, value) -> {
if (value == client) username[0] = key;
});
logger.info("用户{}离开了", username[0]);
socketMap.remove(username[0]);
}
// 自定义一个notification事件,也可以自定义其它任何名字的事件
@OnEvent("notification")
public void notification(SocketIOClient client, AckRequest ackRequest, Message message) {
String topicUserName = (String) message.getPayload().get("topicUserName");
String username = (String) message.getPayload().get("username");
String title = (String) message.getPayload().get("title");
String titleId = (String) message.getPayload().get("id");
String msg = "用户: %s 评论了你的话题: <a href='/topic/%s'>%s</a>";
// notification count
long count = 10;
Map<String, Object> map = new HashMap<>();
map.put("count", count);
map.put("message", String.format(msg, username, titleId, title));
if(socketMap.get(topicUserName) != null) ((SocketIOClient)socketMap.get(topicUserName)).sendEvent("notification", map);
}
}
页面逻辑
<script src="/static/js/socket.io.js"></script> <!--我这把js放在本地了,可以去 https://www.bootcdn.cn/socket.io/ 下载-->
<script>
var socket = io.connect('http://localhost:9092/?username=tomoya');
// socket.on('connect', function () {});
// socket.on('disconnect', function () {});
socket.on('notification', function (data) {
if (data.message) alert(data.message);
if (data.count > 0) {
$("#n_count").text(data.count);
}
});
</script>
参考
源码地址 pybbs
原文链接:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 基于个推(GeTui)官方SDK集成 Laravel 5.* 、Lumen 推送服务包
- iOS 推送通知及推送扩展
- 安卓统一推送联盟明日开启推送通道测试
- 《Web 推送通知》系列翻译 | 第五篇:使用 Web 推送库发送消息 && 第六篇:Web 推送协议
- 推送系统从0到1(七):推送用户画像建立
- 推送系统从0到1(八):个性化精准推送的实现
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
SSA:用户搜索心理与行为分析
[美] 罗森菲尔德(Louis Rosenfeld) / 汤海、蔡复青 / 清华大学出版社 / 2014-4-1 / 59.00
何为站内搜索分析(SSA)?它如何帮助你挖掘用户搜索曰志,从中洞悉用户搜索心理和行为,从而有针对性地改善用户体验,提升网站价值?这些都可以从《SSA:用户搜索心理与行为分析》中找到答案。《SSA:用户搜索心理与行为分析》首先通过故事来说明SSA是如何使Vanguard集团起死回生的,简要介绍SSA并指导读者动手实践。其次,通过丰富的实例来介绍很多工具和方法,帮助读者着手分析用户查询数据,从中获得更......一起来看看 《SSA:用户搜索心理与行为分析》 这本书的介绍吧!