后台代码
package com.ny.until;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.handler.TextWebSocketHandler;
@Configuration
@EnableWebSocket
public class WebSocket implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatMessageHandler(),"/webSocketServer");
}
@Bean
public TextWebSocketHandler chatMessageHandler(){
return new ChatMessageHandler();
}
}
package com.ny.until;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
public class ChatMessageHandler extends TextWebSocketHandler {
private static final Map<String,WebSocketSession> users;// 这个会出现性能问题,最好用Map来存储,key用userid
private static Logger LOG = LoggerFactory.getLogger(ChatMessageHandler.class);
static {
users = new HashMap<String, WebSocketSession>();
}
/**
* 连接成功时候,会触发UI上onopen方法
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
LOG.info("connect to the myself websocket success......" + session.getUri().toString().split("\\?")[1]);
users.put(session.getUri().toString().split("\\?")[1], session);
}
/**
* 在UI在用js调用websocket.send()时候,会调用该方法
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
}
/**
* 给某个用户发送消息
*
* @param userName
* @param message
*/
public static void sendMessageToUser(String name, String message) {
LOG.info(message.toString());
WebSocketSession user = users.get(name);
LOG.info(name);
if (user == null) {
return;
}
try {
if (user.isOpen()) {
LOG.info("给页面发送信息");
user.sendMessage(new TextMessage(message));
}
} catch (IOException e) {
e.printStackTrace();
}
}
//连接中断
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
LOG.debug("handleTransportError:websocket myself connection closed......");
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
LOG.info("afterConnectionClosed:websocket myself connection closed......");
}
@Override
public boolean supportsPartialMessages() {
return false;
}
}
前端写作代码:
// 建立websocket
var websocket = null;
ws = function(address) {
if ('WebSocket' in window) {
websocket = new WebSocket(wsAppConfig.path + address);
} else {
Alert('当前浏览器 Not support websocket', false);
}
return websocket;
}
onMessage = function(websocket) {
websocket.onmessage = function (event) {
// event.data就是后台传过来的数据,然后做处理
}
}