package cn.com.goldenwater.dcproj.socket; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; /** *

* webSocket 服务 *

* * @author luneyq * @author liyz * @date 2019/4/16 14:32 */ @ServerEndpoint("/websocket/{sid}") @Component public class WebSocketServer { private static Logger logger = LoggerFactory.getLogger(WebSocketServer.class); /** * concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。 */ private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet(); /** * 与某个客户端的连接会话,需要通过它来给客户端发送数据 */ private Session session; /** * 接收sid */ private String sid = ""; /** * 连接建立成功调用的方法 */ @OnOpen public void onOpen(Session session, @PathParam("sid") String sid) { this.session = session; this.sid = sid; // 加入set中 webSocketSet.add(this); logger.info("建立连接:{}", sid); // try { // sendMessage("连接成功"); // } catch (IOException e) { // logger.error("websocket IO异常"); // } } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { //从set中删除 webSocketSet.remove(this); logger.info("关闭连接:{}", this.sid); } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */ @OnMessage public void onMessage(String message, Session session) { logger.debug("onMessage来自{}的消息:{}", sid, message); // 群发消息 // for (WebSocketServer item : webSocketSet) { // try { // item.sendMessage(message); // } catch (IOException e) { // e.printStackTrace(); // } // } } /** * 发生错误时调用的方法 * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { logger.error("发生错误", error.getMessage()); error.printStackTrace(); } /** * 实现服务器主动推送 */ public void sendMessage(String message) throws IOException { this.session.getBasicRemote().sendText(message); } /** * 推送自定义消息(sid为null是群发,sid有值是向指定连接单发) */ public static void sendInfo(String message, @PathParam("sid") String sid) { logger.debug("推送给{}的消息:{}", sid, message); for (WebSocketServer item : webSocketSet) { try { // 这里可以设定只推送给这个sid的,为null则全部推送 if (sid == null) { // item.sendMessage(message); } else if (item.sid.equals(sid)) { // 此处只推送单个用户的 item.sendMessage(message); } } catch (IOException e) { continue; } } } public void onClose(String sid) { webSocketSet.remove(sid); } }