SSM+WEBSOCKET
SSM+WEBSOCKET 实现单一聊天和群组聊天以及广播
一、什么是WEBSOCKET?
简单来说WEBSOCKET就是一个通道,基于TCP,也基于HTTP(HTTP基于TCP),这样说可能还是不太清楚。更简单来说,就是如果服务器有信息,则主动发送给前端,客户端。和传统的方案AJAX轮询不一样的就在于主动和被动。
比较AJAX轮询和WEBSOCKET:
AJAX轮询
A:你有我的消息吗 14:00:00
服务器:没有 14:00:00
A:你有我的消息吗 14:00:01
服务器:没有 14:00:01
A:你有我的消息吗 14:00:02
服务器:有了,消息为HELLO 14:00:02
C:你有我的消息吗 14:00:03
服务器:.....我炸 ERROR 14:00:03
WEBSOCKET
A:我们握手吧 14:00:00
服务器:好的,建立连接成功,有消息我会通知你的 14:00:01
服务器:B给你发消息了,消息为
"HELLO!" 15:00:00
从以上两个例子可以看出,WEBSOCKET在执行效率,已经空间利用率等方面都完爆AJAX轮询,当然曾经还有用长轮询等来实现即时通讯,当然这里我就不详细说明了。从以上WEBSOCKET的例子想必你也大概了解了WEBSOCKET的运行模式,当然这并不全面,大家可以通过源码进行底层分析。
···
二、SSM实现WEBSOCKET
有人就要问我了,你说了这么多有什么用?我要的是源码!是源码!
行吧,源码来了。
PS:这里我们是通过注解的方式来实现WEBSOCKET搭建的
WEBSOCKET 我们首先需要核心配置类
1.WebSocketConfig.class
public class WebSocketConfig implements ServerApplicationConfig{
/**
* 注解方式
* 扫描src下所有类@ServerEndPoint注解的类。类似于
*/
public Set<ServerEndpointConfig> getEndpointConfigs(
Set<Class<? extends Endpoint>> scanned) {
return null;
}
//注解的方式
public Set<Class<?>>getAnnotatedEndpointClasses(Set<Class<?>> scanned) {
System.err.println("START CONFIG:" + scanned.size());
return scanned;
}
}
2.WebSocketServer
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/*
*这里的cuttingMergeId可以理解为房间Id,
*/
@ServerEndpoint("/webSocket/chat/{cuttingMergeId}/{permId}")
public class WebSocketServer {
// 使用map来收集session,key为cuttingMergeId,value为同一个房间的用户集合
// concurrentMap的key不存在时报错,不是返回null
private static final Map<String, Set<Session>> rooms = new ConcurrentHashMap();
private static final Map<String, String> permIdList = new ConcurrentHashMap();
@OnOpen
public void connect(@P