SpringBoot整合websocket实现在线客服聊天

时间:2025-03-30 16:57:11
  • import ;
  • import ;
  • import 44j;
  • import ;
  • import .*;
  • import ;
  • import ;
  • import ;
  • import ;
  • import ;
  • import .Set;
  • import ;
  • @Slf4j
  • @Component
  • @ServerEndpoint("/websocket/{username}")
  • public class WebSocket {
  • /**
  • * 在线人数
  • */
  • public static int onlineNumber = 0;
  • /**
  • * 以用户的姓名为key,WebSocket为对象保存起来
  • */
  • private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>();
  • /**
  • * 会话
  • */
  • private Session session;
  • /**
  • * 用户名称
  • */
  • private String username;
  • /**
  • * OnOpen 表示有浏览器链接过来的时候被调用
  • * OnClose 表示浏览器发出关闭请求的时候被调用
  • * OnMessage 表示浏览器发消息的时候被调用
  • * OnError 表示有错误发生,比如网络断开了等等
  • */
  • /**
  • * 建立连接
  • *
  • * @param session
  • */
  • @OnOpen
  • public void onOpen(@PathParam("username") String username, Session session) {
  • onlineNumber++;
  • ("现在来连接的客户id:" + () + "用户名:" + username);
  • = username;
  • = session;
  • ("有新连接加入! 当前在线人数" + onlineNumber);
  • try {
  • //messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
  • //先给所有人发送通知,说我上线了
  • Map<String, Object> map1 = new HashMap<>();
  • map1.put("messageType", 1);
  • map1.put("username", username);
  • sendMessageAll((map1), username);
  • //把自己的信息加入到map当中去
  • (username, this);
  • //给自己发一条消息:告诉自己现在都有谁在线
  • Map<String, Object> map2 = new HashMap<>();
  • map2.put("messageType", 3);
  • //移除掉自己
  • Set<String> set = ();
  • map2.put("onlineUsers", set);
  • sendMessageTo((map2), username);
  • } catch (IOException e) {
  • (username + "上线的时候通知所有人发生了错误");
  • }
  • }
  • @OnError
  • public void onError(Session session, Throwable error) {
  • ("服务端发生了错误" + error.getMessage());
  • //error.printStackTrace();
  • }
  • /**
  • * 连接关闭
  • */
  • @OnClose
  • public void onClose() {
  • onlineNumber--;
  • //(this);
  • (username);
  • try {
  • //messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
  • Map<String, Object> map1 = new HashMap<>();
  • map1.put("messageType", 2);
  • map1.put("onlineUsers", ());
  • map1.put("username", username);
  • sendMessageAll((map1), username);
  • } catch (IOException e) {
  • (username + "下线的时候通知所有人发生了错误");
  • }
  • ("有连接关闭! 当前在线人数" + onlineNumber);
  • }
  • /**
  • * 收到客户端的消息
  • *
  • * @param message 消息
  • * @param session 会话
  • */
  • @OnMessage
  • public void onMessage(String message, Session session) {
  • try {
  • ("来自客户端消息:" + message + "客户端的id是:" + ());
  • JSONObject jsonObject = (message);
  • String textMessage = ("message");
  • String fromusername = ("username");
  • String tousername = ("to");
  • //如果不是发给所有,那么就发给某一个人
  • //messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
  • Map<String, Object> map1 = new HashMap<>();
  • map1.put("messageType", 4);
  • map1.put("textMessage", textMessage);
  • map1.put("fromusername", fromusername);
  • if (("All")) {
  • map1.put("tousername", "所有人");
  • sendMessageAll((map1), fromusername);
  • } else {
  • map1.put("tousername", tousername);
  • sendMessageTo((map1), tousername);
  • }
  • } catch (Exception e) {
  • ("发生了错误了");
  • }
  • }
  • public void sendMessageTo(String message, String ToUserName) throws IOException {
  • for (WebSocket item : clients.values()) {
  • if ((ToUserName)) {
  • ().sendText(message);
  • break;
  • }
  • }
  • }
  • public void sendMessageAll(String message, String FromUserName) throws IOException {
  • for (WebSocket item : clients.values()) {
  • ().sendText(message);
  • }
  • }
  • public static synchronized int getOnlineCount() {
  • return onlineNumber;
  • }
  • }