SpringBoot+WebSocket 实现简易聊天室

这里只介绍大致实现步骤 细节没有具体 需根据真实操作环境完善细节

第一步:初始化一个SpringBoot工程(配置好需要的乱八七糟的东西,例如mybatis等等,因为这里主要讲WebSocket的使用,所以这块就不太详细说了)

第二步:导入依赖

pom.xml 添加如下依赖

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

第三步:创建一个WebSocket的配置类

因为我们创建的springboot工程 ,使用的是内置tomcat 所以需要做以下配置

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

第四步:创建一个WebScoket实例

@ServerEndpoint("/websocket/{userid}")
@Component
@Slf4j
public class PmWebSocket {
    //保存在线用户id以及对应客户端
    public static Map<String, PmWebSocket> onlineUsers = new ConcurrentHashMap<>();
    /**
     * 用来给客户端发送消息
     */
    private Session session;
    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session,@PathParam("userid") String userid) {
        this.session=session;
        log.info(userid+"连接成功");
//将用户id和socket对象保存 onlineUsers.put(userid,this); } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { System.out.println("有一连接关闭"); } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */ @OnMessage public void onMessage(String message, Session session) { System.out.println("来自客户端的消息:" + message); }
/**
*发送消息方法
*/ private void broadcastMsgToAllOnlineUsers(String message) { //根据用户id获取socket对象 这里userid就是上面连接时候的用户id 具体怎么传过来怎么操作 思路很多 你们自己想个思路
//如果是聊天室的话 就要把这个消息发送给所有在线用户 那么就遍历onlineUsers数组就好了 每个人都发送一次 PmWebSocket webSocket = onlineUsers.get("userid"); //获取推送对象 RemoteEndpoint.Basic basicRemote = webSocket.session.getBasicRemote(); try { //发送消息 basicRemote.sendText(sendmessage); } catch (IOException e) { log.error("广播发送系统消息失败!{}", e); e.printStackTrace(); } } } } /** * 发生错误时调用 */ @OnError public void one rror(Session session, Throwable error) { System.out.println("发生错误"); error.printStackTrace(); } }

第五步:前端连接websocket 这里使用的vue   //连接websocket方法 这个放在vue的mounted 或者放在 created里面执行一次就好了 

getWebsocket () {       
let _this=this
//连接socket this.ws= new WebSocket("ws://localhost:8081/websocket/"+this.loginid) //连接成功后执行的方法
this.ws.onopen=function(){ //ws.send("hello") }
//收到消息执行的方法 this.ws.onmessage = function (evt) { //获取数据
var dataStr = evt.data; var item= JSON.parse(dataStr); _this.message.push(item) //这里就是把获取到的消息 添加到数组遍历出来 }
//这个就是跳转路由的时候关闭连接socket 因为我做的是单页面的聊天室 所以做了这个处理
this.$router.afterEach(function () { ws.close() }) },

发送消息方法

  sendMessage(){
      this.ws.send(JSON.stringify({
这里就是消息对象,因为后端要获取消息的相关信息 所以要转成json字符串 方便后端操作数据 })) }

大框架都介绍了 细节自己完善 

如果觉得可以别忘点赞关注哦

上一篇:前端websocket建立以及通信


下一篇:一文吃透 WebSocket 原理