Accept: text/event-stream 表示可接收事件流类型
Cache-Control: no-cache 禁用任何的事件缓存
Connection: keep-alive 表示正在使用持久连接
/**
* 创建连接sse
*
*/
public SseEmitter connect() {
final String clientId = UUID.randomUUID().toString().replace("-", "");
SseEmitterUTF8 sseEmitter = new SseEmitterUTF8(0L);
try {
sseEmitter.send(SseEmitter.event().comment("创建连接成功 !!!"));
} catch (Exception e) {
logger.error("创建连接失败 , {} ", e.getMessage());
}
sseEmitter.onCompletion(() -> {
logger.info("connect onCompletion , {} 结束连接 ...", clientId);
removeClient(clientId);
});
sseEmitter.onTimeout(() -> {
logger.info("connect onTimeout , {} 连接超时 ...", clientId);
removeClient(clientId);
});
sseEmitter.onError((throwable) -> {
logger.error("connect onError , {} 连接异常 ...", clientId);
removeClient(clientId);
});
sseCache.put(clientId, sseEmitter);
return sseEmitter;
}
#请求建立长链接
new WebSocket("ws://192.168.27.201:8080/ws/connect“)
#建立连接、接受数据、关闭连接
@ServerEndpoint("/ws/connect") //类似restful中的@RequestMapping
@Component
public class WebsocketServer {
public static ConcurrentHashMap<String,Session> clintsMap = new ConcurrentHashMap<>();
@OnOpen
public void onOpen(Session session, @PathParam("token")String token){
System.out.println("客户端开始建立连接:"+token);
clintsMap.put(token, session);
}
@OnMessage
public void onMessage(String msg, @PathParam("token")String token){
System.out.println("客户端:"+token + "发送信息给服务器:" + msg);
}
@OnClose
public void onClose(@PathParam("token")String token){
System.out.println("客户端关闭连接:"+token);
clintsMap.remove(token);
}
@OnError
public void onError(Throwable e){
System.out.println("客户端连接发生异常");
}
}
#配置
@Configuration
public class WebSocketConfiguration {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}