whycq
2024-05-02 c937e665ccbb763968d30ef2fad61c9eb935abfe
Merge remote-tracking branch 'origin/phpswcs' into phpswcs
1个文件已修改
3个文件已添加
192 ■■■■■ 已修改文件
pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/ws/ConsoleWebSocket.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/config/WebSocketConfig.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/WebSocketMessage.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -27,6 +27,10 @@
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-tomcat</artifactId>-->
src/main/java/com/zy/asrs/ws/ConsoleWebSocket.java
New file
@@ -0,0 +1,150 @@
package com.zy.asrs.ws;
import com.alibaba.fastjson.JSON;
import com.zy.common.model.WebSocketMessage;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.concurrent.CopyOnWriteArraySet;
@Component
@Slf4j
@Service
@ServerEndpoint("/console/websocket")
@Data
public class ConsoleWebSocket {
    //客户端在线人数
    private static int onlineClient = 0;
    //客户端池
    private static CopyOnWriteArraySet<ConsoleWebSocket> webSocketServers = new CopyOnWriteArraySet<>();
    private Session session;
    //是否鉴权,默认未鉴权
    private boolean auth = false;
    //是否为管理员
    private boolean isAdmin = false;
    //管道ID
    private String sessionId;
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        this.sessionId = session.getId();
        //将websocket对象进行保存
        webSocketServers.add(this);
        //添加在线人数
        addOnlineClient();
        log.info("有新窗口开始监听:" + session.getId() + ",当前在线人数为:" + getOnlineClient());
    }
    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        webSocketServers.remove(this);  //从set中删除
        subOnlineClient();           //在线数减1
        log.info("关闭的连接:" + sessionId);
        log.info("有一连接关闭!当前在线人数为" + getOnlineClient());
    }
    /**
     * 收到客户端消息后调用的方法
     * @ Param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        WebSocketMessage socketMessage = JSON.parseObject(message, WebSocketMessage.class);
        if (socketMessage.getUrl().equals("getTvConfig")) {
            int tvNo = Integer.parseInt(socketMessage.getData());
            if (tvNo == 1) {
                HashMap<String, Object> map = new HashMap<>();
                map.put("ip", "127.0.0.1");
                map.put("port", "111");
                socketMessage.setResult(JSON.toJSONString(map));
                this.sendMessage(JSON.toJSONString(socketMessage));
            }
        }
//        log.info("收到来自连接:" + sessionId + "的信息:" + message);
    }
    /**
     * @ Param session
     * @ Param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误");
        error.printStackTrace();
    }
    /**
     * 实现服务器主动推送
     */
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }
    /**
     * 服务器主动推送给指定用户
     */
    public void sendMessage(String message, String account) throws IOException {
        for (ConsoleWebSocket item : webSocketServers) {
            item.sendMessage(message);
        }
    }
    public void sendMessage(String message, int userId) throws IOException {
        for (ConsoleWebSocket item : webSocketServers) {
            item.sendMessage(message);
        }
    }
    /**
     * 服务器主动推送给指定用户
     */
    public static boolean sendMessageGlobal(String message, String account) throws IOException {
        boolean tag = false;
        for (ConsoleWebSocket item : webSocketServers) {
            tag = true;
            item.sendMessage(message);
        }
        return tag;
    }
    public static boolean sendMessageGlobal(String message, int userId) throws IOException {
        boolean tag = false;
        for (ConsoleWebSocket item : webSocketServers) {
            tag = true;
            item.sendMessage(message);
        }
        return tag;
    }
    public static synchronized int getOnlineClient() {
        return onlineClient;
    }
    public static synchronized void addOnlineClient() {
        ConsoleWebSocket.onlineClient++;
    }
    public static synchronized void subOnlineClient() {
        if (ConsoleWebSocket.onlineClient > 0) {
            ConsoleWebSocket.onlineClient--;
        }
    }
}
src/main/java/com/zy/common/config/WebSocketConfig.java
New file
@@ -0,0 +1,24 @@
package com.zy.common.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/api/socket");
    }
}
src/main/java/com/zy/common/model/WebSocketMessage.java
New file
@@ -0,0 +1,14 @@
package com.zy.common.model;
import lombok.Data;
@Data
public class WebSocketMessage {
    private String url;
    private String data;
    private String result;
}