springboot集成websocket简书

0.首先pom.xml文件中导入如下依赖

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

1.服务端代码如下

package com.uccc.crm.adaptor.websocket;

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.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * ServerEndpoint
 * 使用springboot的唯一区别是要@Component声明下,而使用独立容器是由容器自己管理websocket的,但在springboot中连容器都是spring管理的。
 * 虽然@Component默认是单例模式的,但springboot还是会为每个websocket连接初始化一个bean,所以可以用一个静态set保存起来。
 */
@ServerEndpoint("/saleclue/call/{authorization}") //WebSocket客户端建立连接的地址
@Component
public class SocketServerEndpointS {

    private final static Logger logger = LoggerFactory.getLogger(SocketServerEndpointS.class);
    /**
     * 存活的session集合(使用线程安全的map保存)
     */
    public static Map<String, Session> livingSessions = new ConcurrentHashMap<>();

    /**
     * 建立连接的回调方法
     *
     * @param session       与客户端的WebSocket连接会话
     * @param authorization 用户信息token,WebSocket支持路径参数
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("authorization") String authorization) {
        String sessionId = session.getId();
        livingSessions.put(sessionId, session);
    }

    /**
     * 收到客户端消息的回调方法
     *
     * @param message 客户端传过来的消息
     * @param session 对应的session
     */
    @OnMessage
    public void onMessage(String message, Session session, @PathParam("authorization") String authorization) throws IOException {
        System.out.println(message);
        session.getBasicRemote().sendText("收到");
    }

    /**
     * 发生错误的回调方法
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        logger.info("socket 发生错误 error:{}", error.toString());
    }

    /**
     * 关闭连接的回调方法
     */
    @OnClose
    public void onClose(Session session, @PathParam("authorization") String authorization) {
        livingSessions.remove(session.getId());
    }

}

@Configuration
public class ApplicationConfiguration {
    
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
springboot项目启动后就可以啦

2.客户端js如下:

<script type="text/javascript">
let url="ws://malebazi.com/adaptor/saleclue/call/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vdWNjYy5jYyIsInRlbmFudElkIjo0NywidWlkIjoxMTYwMSwiZXhwIjozNjc0NjQxMTc3LCJpYXQiOjE1MjcxNTc1MzB9.2f_oRHkh7zzxTwGxo_FQkZfLD4bAy50YfUA-nctdHuM";
  const socket = new WebSocket(url);
// Connection opened
socket.addEventListener('open', function (event) {
  alert("链接成功")
    socket.send('{"type":"idle","callId":"123"}');
});
socket.οnerrοr=e=>{
alert("error")
}
// Listen for messages
socket.addEventListener('message', function (event) {
    console.log('Message from server', event.data);
});

socket.addEventListener('close', function (event) {
  alert("关闭成功")
});

</script>

3.说明 

 ws://malebazi.com/adaptor/saleclue/call/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vdWNjYy5jYyIsInRlbmFudElkIjo0NywidWlkIjoxMTYwMSwiZXhwIjozNjc0NjQxMTc3LCJpYXQiOjE1MjcxNTc1MzB9.2f_oRHkh7zzxTwGxo_FQkZfLD4bAy50YfUA-nctdHuM

 为访问路径,websocket 支持路径参数,最后面长串为加密的字符串,服务端接受到后可以拿来解析!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值