目录
后端配置:
1.配置Config
2.WebSocket
前端:
使用
后端配置:
1.配置Config
@Component
public class WebSocketConfig {
/**
* ServerEndpointExporter 作用
*
* 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
*
* @return
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
ps:在我的生产项目中,该配置文件会导致部署时报错(windows服务器Tomcat部署)。删除该配置文件,不报错,可正常使用。
2.WebSocket
@Slf4j
@Component
@ServerEndpoint("/websocket/{name}")
public class WebSocket {
/**
* 与某个客户端的连接对话,需要通过它来给客户端发送消息
*/
private Session session;
/**
* 标识当前连接客户端的用户名
*/
private String name;
/**
* 用于存所有的连接服务的客户端,这个对象存储是安全的
*/
private static ConcurrentHashMap<String,WebSocket> webSocketSet = new ConcurrentHashMap<>();
@OnOpen
public void OnOpen(Session session, @PathParam(value = "name") String name){
this.session = session;
this.name = name;
// name是用来表示唯一客户端,如果需要指定发送,需要指定发送通过name来区分
webSocketSet.put(name,this);
log.info("[WebSocket] 连接成功,当前连接人数为:={}",webSocketSet.size());
}
@OnClose
public void OnClose(){
webSocketSet.remove(this.name);
log.info("[WebSocket] 退出成功,当前连接人数为:={}",webSocketSet.size());
}
@OnMessage
public void OnMessage(String message){
log.info("[WebSocket] 收到消息:{}",message);
//判断是否需要指定发送,具体规则自定义
if(message.indexOf("TOUSER") == 0){
String name = message.substring(message.indexOf("TOUSER")+6,message.indexOf(";"));
AppointSending(name,message.substring(message.indexOf(";")+1,message.length()));
}else{
GroupSending(message);
}
}
/**
* 群发
* @param message
*/
public void GroupSending(String message){
for (String name : webSocketSet.keySet()){
try {
webSocketSet.get(name).session.getBasicRemote().sendText(message);
}catch (Exception e){
e.printStackTrace();
}
}
}
/**
* 指定发送
* @param name
* @param message
*/
public void AppointSending(String name,String message){
try {
webSocketSet.get(name).session.getBasicRemote().sendText(message);
}catch (Exception e){
e.printStackTrace();
}
}
}
前端:
initWebSocket(id){ //初始化weosocket
const wsuri = this.$store.state.user.url.replace('http','ws')+"/xx/websocket/" + id + ',' + this.RndNum(5);
this.websock = new WebSocket(wsuri);
this.websock.onmessage = this.websocketonmessage;
this.websock.onopen = this.websocketonopen;
this.websock.onerror = this.websocketonerror;
this.websock.onclose = this.websocketclose;
},
websocketonopen(){ //连接建立之后执行send方法发送数据
// this.websocketsend(JSON.stringify(actions));
},
websocketonerror(){//连接建立失败重连
this.initWebSocket(id);
},
websocketonmessage(e){ //数据接收
try{
// console.log("origin:",e)
const redata = JSON.parse(e.data)
// console.log("推送JSON.parse(e.data):",redata)
this.eqInsGet(redata) //自定义处理
} catch (e) {
console.log("推送e:",e)
}
},
websocketsend(Data){//数据发送
this.websock.send(Data)
},
websocketclose(e){ //关闭
console.log('断开连接', e)
},
wsuri 完整路径:“ ws://localhost:port/项目前缀/websocket/id,随机数 ”
对应 @ServerEndpoint("/websocket/{name}")
在后台,String name=“ id,随机数 ”
使用
@GetMapping("msg")
public Object testWebSocket2Web(){
// String msg = "{\"ceshi\":\"测试信息,不用操作\"}";
webSocket.GroupSending(msg);
return true;
}
|