方式1:html5原生支持方式
向spring容器中注入一个ServerEndpointExporter
package com.tinet.websocket.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* @author dsx
*/
@Configuration
public class WebsocketConfig {
/**
* ServerEndpointExporter 作用
*
* 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
*
* @return
*/
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
添加一个serverEndpoint
用于给前端建立连接的server
package com.tinet.websocket.config;
import com.alibaba.fastjson.JSON;
import com.tinet.websocket.pojo.MessageBody;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author DENGSHAOXIANG
*/
@ServerEndpoint("/websocket/test/{userId}")
@Component
public class WebsocketServer {
public WebsocketServer() {
//每当有一个连接,都会执行一次构造方法
System.out.println("新的连接。。。");
}
/**
* 存放当前连接数
*/
private static final AtomicInteger COUNT = new AtomicInteger();
/**
* 存放所有的连接
*/
private static final ConcurrentHashMap<String, Session> SESSIONS = new ConcurrentHashMap<>();
//发送消息
public void sendMessage(Session toSession, String message) {
if (toSession != null) {
try {
toSession.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("对方不在线");
}
}
public void sendMessageToUser(String user, String message) {
Session toSession = SESSIONS.get(user);
sendMessage(toSession, message);
}
@OnMessage
public void onMessage(String message) {
System.out.println("服务器收到消息:" + message);
MessageBody messageBody = JSON.parseObject(message, MessageBody.class);
String userId = messageBody.getUserId();
sendMessageToUser(userId, messageBody.getMessage());
}
@OnOpen
public void onOpen(Session session, @PathParam("userId") String userId) {
if (SESSIONS.get(userId) != null) {
return;
}
SESSIONS.put(userId, session);
COUNT.incrementAndGet();
System.out.println(userId + "上线了,当前在线人数:" + COUNT);
}
@OnClose
public void onClose(@PathParam("userId") String userId) {
SESSIONS.remove(userId);
COUNT.decrementAndGet();
System.out.println(userId + "下线了ÿ