WebSocket實時推送訊息
阿新 • • 發佈:2018-11-13
廢話不多說,直接上程式碼,本人親自測試,可以使用。
前臺js程式碼:
var websocket; var path = window.location.host+"/web-socket"; // 首先判斷是否 支援 WebSocket if('WebSocket' in window) { websocket = new WebSocket("ws://"+path+"/ws"); } else if('MozWebSocket' in window) { websocket = new MozWebSocket("ws://"+path+"/ws"); } else { websocket = new SockJS(window.location.origin+"/web-socket/socketJs/"); } // 開啟連線時 websocket.onopen = function(evnt) { console.log(" websocket.onopen "); }; // 收到訊息時 websocket.onmessage = function(evnt) { console.log(evnt.data); }; websocket.onerror = function(evnt) { console.log(" websocket.onerror "); }; websocket.onclose = function(evnt) { console.log(" websocket.onclose "); }
後臺java程式碼
WebSocketConfig.java
@Configuration @EnableWebMvc @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer{ @Autowired private SocketHandler socketHandler; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(socketHandler, "/ws").addInterceptors(new HttpSessionHandshakeInterceptor()); registry.addHandler(socketHandler, "/sockjs/socketServer").addInterceptors(new HttpSessionHandshakeInterceptor()).withSockJS(); } }
WebSocketInterceptor.java
public class WebSocketInterceptor implements HandshakeInterceptor{ private static final Log log=LogFactory.getLog(WebSocketInterceptor.class); @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler, Exception exceptions) { log.info("=================執行 afterHandshake :handler: "+handler+"exceptions: "+exceptions); } @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler, Map<String, Object> map) throws Exception { log.info("==================執行 beforeHandshake :handler: "+handler+"map: "+map.values()); if(request instanceof ServerHttpRequest){ ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; HttpSession session = servletRequest.getServletRequest().getSession(); if(session!=null){ User user=(User)session.getAttribute("user"); log.info("==================user== "+user); map.put(user.getUserName(), user); } } return true; } }
SocketHandler.java
@Service
public class SocketHandler implements WebSocketHandler{
private static final Log log=LogFactory.getLog(SocketHandler.class);
private static final Map<String,WebSocketSession> userMap;
//線上使用者
static {
userMap = new HashMap<>();
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus arg1) throws Exception {
log.info("Websocket:"+session.getId()+"已經關閉!");
String userId=this.getUserName(session);
if(userMap.get(userId) != null){
userMap.remove(userId);
log.info("Websocket:"+userId+"使用者已經移除!");
}
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
String userId=this.getUserName(session);
if(userMap.get(userId) == null){
userMap.put(userId, session);
log.info("Websocket:"+userId+"使用者建立連線成功!");
}else{
log.info("Websocket:"+userId+"使用者已經連線!");
}
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
session.sendMessage(message);
log.info("Websocket:handleMessage send message:"+message);
}
@Override
public void handleTransportError(WebSocketSession arg0, Throwable error) throws Exception {
log.error("Websocket:handleMessage send message:"+error);
}
@Override
public boolean supportsPartialMessages() {
return false;
}
public void sendMessageToUser(String userId, TextMessage message) {
WebSocketSession session = userMap.get(userId);
if(session !=null && session.isOpen()) {
try {
session.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @Title: sendMessageToUsers
* @Description: 給所有使用者傳送資訊
* @param @param message
* @return void
* @date createTime:2018年4月26日上午9:44:33
*/
public void sendMessageToUsers(String msg) {
TextMessage message = new TextMessage(msg);
Set<String> userIds = userMap.keySet();
for(String userId: userIds) {
this.sendMessageToUser(userId, message);
}
}
/**
* @Title: getUserId
* @Description: 獲取使用者id
* @param @param session
* @param @return
* @return String
* @date createTime:2018年4月26日上午9:44:59
*/
public String getUserName(WebSocketSession session){
Object obj = session.getAttributes().get("user");
if(obj instanceof User){
User user = (User) obj;
return user.getUserName();
}
return null;
}
public void sendMessage(Object object) {
TextMessage message = new TextMessage(JSONObject.toJSONString(object));
Set<String> userIds = userMap.keySet();
for(String userId: userIds) {
this.sendMessageToUser(userId, message);
}
}
}