package com.fzzy.gateway.hx2023.websocket; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.CrossOrigin; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArraySet; @Component @CrossOrigin @Service @ServerEndpoint(value = "/mqtt") public class SocketService { /** * 用来存放每个客户端对应的MyWebSocket对象。 **/ private static CopyOnWriteArraySet socketSet = new CopyOnWriteArraySet<>(); /** * 与某个客户端的连接会话,需要通过它来给客户端发送数据 **/ private Session session; /** * 用户名称 **/ private String nickname; /** * 用来记录sessionId和该session进行绑定 **/ private static Map map = new HashMap(); /** * 连接建立成功调用的方法 */ @OnOpen public void onOpen(Session session,@PathParam("nickname") String nickname) { this.session = session; this.nickname=nickname; map.put(nickname, session); socketSet.add(this); System.out.println("有新连接加入:"+nickname+",当前在线人数为" + socketSet.size()); } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { socketSet.remove(this); List nickname = this.session.getRequestParameterMap().get("nickname"); for(String nick:nickname) { map.remove(nick); } System.out.println("有一连接关闭!当前在线人数为" + socketSet.size()); } /** * 收到客户端消息后调用的方法 */ @OnMessage public void onMessage(String message, Session session,@PathParam("nickname") String nickname) { System.out.println("来自客户端的消息-->"+nickname+": " + message); //将mqtt发送过来的数据返回给前端 try { // JSONObject parse = JSONObject.parse(message); // Map valuesMap = (Map) parse.getByPath("values"); // String tag1 = valuesMap.get("tag1").toString(); // String replace = tag1.replace("\r\n", ""); // String substring = replace.substring(replace.indexOf(":") + 1).trim().replace(" ",":"); // String tag2 = valuesMap.get("tag2").toString(); // String substring1=substring+"tag2:"+tag2; // String result="{"+substring1+"}"; // //发送给前端,用作页面渲染 // Session fromSession = map.get(nickname); // fromSession.getAsyncRemote().sendText(result); } catch (Exception e) { e.printStackTrace(); } } /** * 发生错误时调用 */ @OnError public void onError(Session session, Throwable error) { System.out.println("发生错误"); error.printStackTrace(); } }