首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

websocket

  • 25-01-18 12:43
  • 4050
  • 14197
blog.csdn.net

添加依赖

  
    org.springframework.boot  
    spring-boot-starter-websocket  
 
​

    com.alibaba
    fastjson
    1.2.76

开启WebSocket支持

在config层建立 WebSocketConfig 类

package com.qcby.websocketdemo.config;
​
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
​
/**
 * @ Description: 开启WebSocket支持
 */
@Configuration
public class WebSocketConfig {
​
    // 开启WebSocket支持
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
​
}

WebSocket具体业务

在service层建立 WebSocketService 类

package cc.mrbird.febs.external.webScoket;
​
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
​
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.CopyOnWriteArraySet;
​
@Component
@Service
//  @ServerEndpoint  将目前的类定义成一个 websocket 服务器端
//  注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
@ServerEndpoint("/api/websocket/{sid}")
public class WebSocketServer {
    //存放每个客户端对应的MyWebSocket对象  id对象
    private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();
    //用户信息
    private Session session;
    //接收sid
    private String sid = "";
    //当前在线连接数
    private static int onlineCount = 0;
​
    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
        this.session = session;
        webSocketSet.add(this);     //加入set中
        this.sid = sid;
        addOnlineCount();           //在线数加1
        try {
            sendMessage("conn_success");
            log.info("有新窗口开始监听:" + sid + ",当前在线人数为:" + getOnlineCount());
        } catch (IOException e) {
            log.error("websocket IO Exception");
        }
    }
    
     /**
     * 实现服务器主动推送
     */
    //  前端会根据websocket.onmessage = function(event) {}  来接收这里传出的数据
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }
    
    /**
     * 收到客户端消息后调用的方法
     * @ Param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("收到来自窗口" + sid + "的信息:" + message);
        //群发消息
        for (WebSocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
​
    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        webSocketSet.remove(this);  //从set中删除
        subOnlineCount();           //在线数减1
       
        log.info("释放的sid为:"+sid);
        
        log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
​
    }
​
    /**
     * @ Param session
     * @ Param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误");
        error.printStackTrace();
    }
​
    /**
     * 群发自定义消息
     */
    public static void sendInfo(String message, @PathParam("sid") String sid) throws IOException {
        log.info("推送消息到窗口" + sid + ",推送内容:" + message);
​
        for (WebSocketServer item : webSocketSet) {
            try {
                //为null则全部推送
                if (sid == null) {
//                    item.sendMessage(message);
                } else if (item.sid.equals(sid)) {
                    item.sendMessage(message);
                }
            } catch (IOException e) {
                continue;
            }
        }
    }
​
    public static synchronized int getOnlineCount() {
        return onlineCount;
    }
​
    public static synchronized void addOnlineCount() {
        WebSocketServer.onlineCount++;
    }
​
    public static synchronized void subOnlineCount() {
        WebSocketServer.onlineCount--;
    }
​
    public static CopyOnWriteArraySet getWebSocketSet() {
        return webSocketSet;
    }
}

前端代码

先写接收消息websocket.onmessage 再写发送消息send()



​
 
  
  Java 后端 WebSocket 的 Tomcat 实现
  
 
​
 
      
    Welcome
       
       
   
​
注:本文转载自blog.csdn.net的KBkongbaiKB的文章"https://blog.csdn.net/KBkongbaiKB/article/details/144402861"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

129
网络与通信
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top