| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- 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;
- /**
- * <p>
- * webSocket 服务
- * </p>
- *
- * @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<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
- /**
- * 与某个客户端的连接会话,需要通过它来给客户端发送数据
- */
- 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);
- }
- }
|