springboot整合websocket
1.配置springboot支持websocket
package com.example.demo.websocket;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* websocket配置
* @author jiajia
*/
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
2.websocket服务
package com.example.demo.websocket;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
/**
* springboot集成websocket
* @author jiajia
*/
@ServerEndpoint("/websocket/{id}")
@Component
public class WebSocketServer {
public static final Object lock=new Object();
/**
* 记录在线人数
*/
private static int onlineCount = 0;
/**
* WebSocketServer对象集合
*/
private static final Map<String,WebSocketServer> webSocketMap = new HashMap<String,WebSocketServer>();
/**
* 回话
*/
private Session session;
/**
* id标识
*/
private String id;
private AStar astar;
/**
* 连接成功时调用
* @param session
* @param sid
*/
@OnOpen
public void onOpen(Session session,@PathParam("id") String id) {
this.session = session;
putObj(id);
addOnlineCount();
try {
sendMessage("{type:1,msg:'连接成功'}");
} catch (IOException e){
}
}
/**
* 连接关闭时调用
*/
@OnClose
public void onClose() {
delObj();
subOnlineCount();
System.out.println("删除"+this.id);
}
/***
* 接受客户端发送消息时调用
* @param message 消息
* @param session
*/
@OnMessage
public void onMessage(String message, Session session) {
try {
Map<String,Object> map=JSON.parseObject(message);
System.out.println(map.get("type"));
if(map.containsKey("type")) {
if(Integer.valueOf(map.get("type").toString()).equals(1)) {//请求地图
astar = new AStar(this,Integer.valueOf(map.get("wid").toString()));
String s=JSON.toJSONString(astar.NODES);
sendMessage("{type:6,msg:"+s+"}");
System.out.println("-");
}else if(Integer.valueOf(map.get("type").toString()).equals(2)){//修改地图
int x=Integer.valueOf(map.get("x").toString());
int y=Integer.valueOf(map.get("y").toString());
if(this.astar.NODES[x][y]==0) {
this.astar.NODES[x][y]=1;
}else {
this.astar.NODES[x][y]=0;
}
}else if(Integer.valueOf(map.get("type").toString()).equals(3)){
System.out.println(map);
int startX=Integer.valueOf(map.get("startX").toString());
int startY=Integer.valueOf(map.get("startY").toString());
int endX=Integer.valueOf(map.get("endX").toString());
int endY=Integer.valueOf(map.get("endY").toString());
this.astar.begin(startX, startY, endX, endY);
}
}
sendMessage("{type:2,msg:'收到消息'}");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 给某个指定id发送消息
* @param id
* @return
*/
public boolean sendMessageById(String id,String message) {
WebSocketServer obj=webSocketMap.get(id);
if(obj!=null) {
try {
obj.sendMessage(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
}else {
return false;
}
}
/**
* 群发消息
* @param message
* @return
*/
public void sendMessageGroup(String message) {
synchronized (lock) {
for (Map.Entry<String,WebSocketServer> entry : webSocketMap.entrySet()) {
try {
sendMessage(entry.getValue().session, message);
} catch (IOException e) {
}
}
}
}
/**
* 连接发生异常时调用
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
System.out.println("链接异常");
delObj();
subOnlineCount();
error.printStackTrace();
}
/**
* 服务器向本次连接的前端发送消息
* @param message
* @throws IOException
*/
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
/**
* 向某链接发送消息
* @param session
* @param message
* @throws IOException
*/
private void sendMessage(Session session,String message) throws IOException {
session.getBasicRemote().sendText(message);
}
/**
* 向webSocketMap集合中添加此对象的引用
* @param id
*/
private void putObj(String id) {
synchronized (lock){
if(!webSocketMap.containsKey(id)) {
webSocketMap.put(id,this);
this.id=id;
System.out.println(id+"链接成功:"+getOnlineCount());
}
}
}
/**
* 从webSocketMap中删除对本对象的引用
*/
private void delObj() {
synchronized (lock){
webSocketMap.remove(this.id);
}
}
/**
* 获取在线人数
* @return
*/
public static synchronized int getOnlineCount() {
return onlineCount;
}
/**
* 在线人数+1
*/
private static synchronized void addOnlineCount() {
WebSocketServer.onlineCount++;
}
/**
* 在线人数-1
*/
private static synchronized void subOnlineCount() {
WebSocketServer.onlineCount--;
}
}
评论区
请写下您的评论...
猜你喜欢
blog
springboot整合mybatis
框架
2780
springboot整合mybatis1.创建maven项目2.sql文件SETNAMESutf8mb4;SETFOREIGN_KEY_CHECKS=0
weblog
1225
pomparent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.1.3.RELEASE/version /parentdependencies dependency groupIdorg.springframework.boot/group
java框架
1378
springboot整合elasticsearch框架实现全文索引demo配置说明参考:http://www.jiajiajia.club/blog/artical/Ja4t7X/378
blog
springboot整合shiro权限
框架
1687
1.pom文件dependencygroupIdorg.apache.shiro/groupIdartifactIdshiro-spring/artifactIdversion1.4.0/version/dependencydependency groupIdorg.apache.shiro/groupId artifactIdshiro-ehcache/artifactId vers
blog
springboot整合redis数据库
框架
2701
安装redis数据库参考:http://www.jiajiajia.club/blog/artical/166redis配置详解参考:http://www.jiajiajia.club/blog/artical/210安装完数据库以后如果不是本地连接记得修改密码requirepass。默认是没有密码需要后台运行修改daemonizeyes默认是noyml配置文件spring:redis:host:
框架
2602
在springboot整合视图层,官方推荐使用thymeleaf。thymeleaf只是渲染html的一种方式,是一种模板。第一步创建一个maven项目第二步:修改Jdk版本,添加thymeleaf
框架
1576
版本说明,不同的springboot版本也对应着不同的elasticsearch版本,如果版本不对应客户端和服务端都会报相应的错误,对应关系请自行百度,本次测试的版本如下:springboot版本
official
912
[TOC]一、pom文件?xmlversion="1.0"encoding="UTF-8"?projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。