springboot使用websocket简单demo

springboot使用websocket简单demo

导入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.6.13</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

编写两个配置

@Configuration
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }

}
public class WebSocketServer extends ServerEndpointConfig.Configurator {

    //鉴权
    @Override
    public boolean checkOrigin(String originHeaderValue) {
        return true;
    }


    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        Map<String, List<String>> parameterMap = request.getParameterMap();
        //erp为连接标识符,前端传
        List<String> erp = parameterMap.get("erp");
        if (!CollectionUtils.isEmpty(erp)){
            sec.getUserProperties().put("erp",erp.get(0));
        }
    }
}

测试

@Slf4j
@Component
@ServerEndpoint(value = "/ws/test", configurator = WebSocketServer.class)
public class WebSocketService {

    //在线连接数
    private static AtomicInteger onlineCount = new AtomicInteger(0);

    //在线客户端
    private static Map<String, WebSocketService> clients = new ConcurrentHashMap<>();

    //每个连接的会话
    @Getter
    private Session session;

    //标识当前会话
    private String erp = "";

    @OnOpen
    public void onOpen(Session session, EndpointConfig config) throws IOException {
        Map<String, Object> userProperties = config.getUserProperties();
        String s = (String) userProperties.get("erp");
        this.erp = s;
        this.session = session;

        //在线
        if (clients.containsKey(this.erp)){
            clients.get(this.erp).session.close();
            clients.remove(this.erp);
            onlineCount.decrementAndGet();
        }
        clients.put(this.erp,this);
        onlineCount.getAndIncrement();
        log.info("新连接加入:{},当前在线人数:{}",this.erp,onlineCount.get());
    }

    @OnMessage
    public void onMessage(String message,Session session) throws IOException {
        log.info("服务端收到客户端[{}]的消息:{}", this.erp, message);
        //心跳机制
        if (message.equals("ping")) {
            this.sendMessage("pong", session);
        }
    }

    public void sendMessage(String message, Session session) {
        log.info("服务端给客户端[{}]发送消息{}", this.erp, message);
        try {
            session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            log.error("{}发送消息发生异常,异常原因{}", this.erp, message);
        }
    }

    @OnClose
    public void close() throws IOException {
        if (clients.containsKey(erp)){
            clients.get(erp).session.close();
            clients.remove(erp);
            onlineCount.decrementAndGet();
            log.info("关闭连接{},在线人数{}",this.erp,onlineCount);
        }
    }

}

效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

好的,以下是一个简单Springboot配置WebSocketDEMO: 1. 配置依赖 ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 配置Endpoint ``` import org.springframework.stereotype.Component; import org.springframework.web.socket.server.standard.SpringConfigurator; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; @ServerEndpoint(value = "/websocket", configurator = SpringConfigurator.class) @Component public class WebSocketServer { //连接建立成功调用 @OnOpen public void onOpen(Session session) { System.out.println("WebSocket连接建立成功!"); } //连接关闭调用 @OnClose public void onClose() { System.out.println("WebSocket连接关闭!"); } //接收到客户端消息时调用 @OnMessage public void onMessage(String message, Session session) { System.out.println("接收到来自客户端的消息:" + message); sendMessage("已经接收到您发送的消息:" + message, session); } //发生错误时调用 @OnError public void onError(Session session, Throwable error) { System.out.println("WebSocket发生错误:" + error.getMessage()); } //发送消息 public void sendMessage(String message, Session session) { try { session.getBasicRemote().sendText(message); } catch (Exception e) { System.out.println("发送消息出错:" + e.getMessage()); } } } ``` 3. 配置WebSocket配置类 ``` import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfig { public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } ``` 4. 测试 ``` //客户端代码 var ws = new WebSocket("ws://localhost:8080/websocket"); ws.onopen=function(event){ console.log("WebSocket连接建立成功!"); ws.send("Hello WebSocket!"); } ws.onmessage=function(event){ console.log("接收到服务端的消息:"+event.data); } ws.onclose=function(event){ console.log("WebSocket连接关闭!"); } ``` 这是一个简单WebSocket Demo,您可以根据自己的需求进行修改。希望能帮到您!如果您有任何问题,欢迎继续提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值