package com.chsha.commonwebsocket.spbwebsocket.domain; import com.alibaba.fastjson.JSONObject; import com.chsha.commonwebsocket.socketutil.WebSocketUtil; import com.chsha.commonwebsocket.spbwebsocket.model.SessionModel; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.Map; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; /** * @ClassName WebSocketServer * @Author zy * @Date 2021/4/19 19:21 * @Version * @Info */ @ServerEndpoint(value = "/websocket") @Component public class WebSocketServer { @PostConstruct public void init() { System.out.println("websocket 加载"); } private static final Logger log = Logger.getLogger(WebSocketServer.class); private static final AtomicInteger OnlineCount = new AtomicInteger(0); // concurrent包的线程安全Set,用来存放每个客户端对应的Session对象。 private static CopyOnWriteArraySet<SessionModel> SessionSet = new CopyOnWriteArraySet<SessionModel>(); /** * 连接建立成功调用的方法 */ @OnOpen public void onOpen(Session session) { Map map=session.getRequestParameterMap(); SessionModel sessionModel=new SessionModel(map.get("token").toString(),session); SessionSet.add(sessionModel); int cnt = OnlineCount.incrementAndGet(); log.info("有连接加入,当前连接数为:"+ cnt); // SendMessage(session, "连接成功"); } /** * 连接关闭调用的方法 */ @OnClose public void onClose(Session session) { for(SessionModel sessionModel:SessionSet){ if(session==sessionModel.getSession()){ SessionSet.remove(sessionModel); int cnt = OnlineCount.decrementAndGet(); log.info("有连接关闭,当前连接数为:"+cnt); } } } /** * 收到客户端消息后调用的方法 * * @param message * 客户端发送过来的消息 */ @OnMessage(maxMessageSize = 1048576) public void onMessage(String message, Session session) { log.info("来自客户端的消息:"+message); JSONObject jsonMessage=JSONObject.parseObject(message); try { sendJsonMessage(jsonMessage); } catch (IOException e) { e.printStackTrace(); } } /** * 出现错误 * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.error("发生错误:"+error.getMessage()+",Session ID: "+session.getId()); error.printStackTrace(); } /** * 发送消息,实践表明,每次浏览器刷新,session会发生变化。 * @param session * @param message */ public static void SendMessage(Session session, String message) { try { session.getBasicRemote().sendText(message); } catch (IOException e) { log.error("发送消息出错:"+ e.getMessage()); e.printStackTrace(); } } /** * 群发消息 * @param message * @throws IOException */ public static void BroadCastInfo(String message) throws IOException { for (SessionModel sessionModel : SessionSet) { if(sessionModel.getSession().isOpen()){ SendMessage(sessionModel.getSession(), message); } } } /** * 指定Session发送消息 * @param token * @param message * @throws IOException */ public static void SendMessage(String message,String token) throws IOException { Session session = null; for (SessionModel sessionModel : SessionSet) { if(sessionModel.getToken().equals("["+token+"]")){ session = sessionModel.getSession(); break; } } if(session!=null){ SendMessage(session, message); } else{ log.warn("没有找到你指定ID的会话:"+token); } } /** * 用于发送json信息 * @param jsonMessage */ public static void sendJsonMessage(JSONObject jsonMessage) throws IOException { String type=jsonMessage.getString("type"); if(type!=null){ String token=jsonMessage.getString("token"); String friendToken=jsonMessage.getString("friendToken"); jsonMessage.put("token",friendToken); jsonMessage.put("friendToken",token); SendMessage(jsonMessage.toJSONString(),friendToken); } } }
SpringBoot集成webSocket时如果传输的文件过大需要设置