人间蒸发的gravatar头像
人间蒸发 2019-07-01 14:03:26
spring boot配置websocket

一,我先说明一下我理解的websocket。一般的,都是由客户端发起请求,服务器响应,服务器不主动响应,就好比俩人谈恋爱,总是客户端主动,主动掏钱,主动约服务器,服务器不要脸啊,给我就收着就是这么种感觉。那么websock的协议出现,就得告诉服务器,你俩处对象得AA,或者AB制,你也得主动,你也得考虑客户端的感受哈!so,客户端发起请求给服务器,服务器也会主动的给客户端主动发出通知,那么这样的一种“处对象,拒绝舔狗”的模式,就叫做websocket

 

下面我就贴代码了!

1.添加websocket依赖

<!--websocket依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
    <!-- 版本号跟你的boot版本号一样 -->
</dependency>

 

使用@ServerEndpoint创立websocket endpoint。首先要注入ServerEndpointExporter,这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint。要注意,如果使用独立的servlet容器,而不是直接使用springboot的内置容器,就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。

 

//配置类
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
//服务类
@ServerEndpoint("/websocket/{sid}")
@Component
public class WebSocketServer {
    private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);

    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;
    //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;
        webSocketSet.add(this);     //加入set中
        addOnlineCount();           //在线数加1
        log.info("有新窗口开始监听:"+sid+",当前在线人数为" + getOnlineCount());
        this.sid=sid;
        try {
            sendMessage("连接成功");
        } catch (IOException e) {
            log.error("websocket IO异常");
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        webSocketSet.remove(this);  //从set中删除
        subOnlineCount();           //在线数减1
        log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @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();
            }
        }
    }

    /**
     *
     * @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 static void sendInfo(String message,@PathParam("sid") String sid) throws IOException {
        log.info("推送消息到窗口"+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 static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        WebSocketServer.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        WebSocketServer.onlineCount--;
    }
}

controller类

@RestController
@RequestMapping("/checkcenter")
public class CheckCenterController {
    //推送数据接口
    @ResponseBody
    @RequestMapping("/socket/push/{cid}")
    public R pushToWeb(@PathVariable String cid, String message) {
        try {
            WebSocketServer.sendInfo(message,cid);
        } catch (IOException e) {
            e.printStackTrace();
            return R.error(cid+"#"+e.getMessage());
        }
        return R.ok(cid);
    }
}

 

测试一下!!!

spring boot配置websocketspring boot配置websocket

controller测试!发出请求

spring boot配置websocket

spring boot配置websocket

 

后期有时间我再给大家做个聊天框实例的代码吧!方便大家更好的学习!!!加油哦!


打赏

已有2人打赏

已注销用户的gravatar头像 小二上代码的gravatar头像
最近浏览
1061302569 2022年10月20日
暂无贡献等级
壹级天灾  LV14 2021年7月27日
doubled  LV1 2020年12月28日
懒得起  LV8 2020年9月9日
已注销用户  LV34 2020年4月1日
humorl  LV1 2020年3月15日
dreafm 2020年2月8日
暂无贡献等级
x1052760199  LV1 2020年1月19日
watercolor  LV5 2020年1月14日
hui520 2019年12月24日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友