springboot使用webscoket

springboot添加config配置项

package cn.lsy.api.yuy.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;


@Configuration
public class WebSocketConfig {
    
    // 配置文件
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
    
}

springboot websocket主类

package cn.lsy.api.yuy.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;

import cn.lsy.api.yuy.entity.Message;

@Component
@ServerEndpoint("/chat/{id}")
public class Websocket {

    private static final Map<String, Session> onLineList = new HashMap<>();

    @OnOpen
    public void OnOpen(Session session, @PathParam("id") String id) {
        // 用户上线
        onLineList.put(id, session);
        // 群发所有人有人上线更新上线列表
        onLineList.forEach((key, value) -> {
            try {
                value.getBasicRemote().sendText(JSON.toJSONString(getOnLine()));
            } catch (IOException e) {
            }
        });
    }

    @OnMessage
    public void onmessage(Session session, String message, @PathParam("id") String id) {
        Message message2 = JSON.parseObject(message,Message.class);
        // 群发所有人
        onLineList.forEach((key, value) -> {
            try {
                value.getBasicRemote().sendText(message2.getContent());
            } catch (IOException e) {
                System.out.println(e);
            }
        });
    }
    public Message getOnLine(){
        ArrayList<String> arrayList = new ArrayList<>();
        Message message = new Message();
        onLineList.forEach((key, value) -> {
            arrayList.add(key);
        });
        message.setOnLinSet(arrayList);
        message.setType("3");
        return message;
    }

    @OnClose
    public void onclose(Session session, @PathParam("id") String id) {
        onLineList.remove(id);
        // 群发所有人有人下线更新在线列表
        onLineList.forEach((key, value) -> {
            try {
                value.getBasicRemote().sendText(JSON.toJSONString(getOnLine()));
            } catch (IOException e) {
                // TODO: handle exception
            }
        });
    }

}

springboot消息实体类

package cn.lsy.api.yuy.entity;

import java.util.List;

import lombok.Data;

@Data
public class Message {

    public String type;
    public String content;
    public Integer fromId;
    public Integer toId;
    public List onLinSet;

}

vue

<template>
    <div>
      <div>
        <label for="user">用户名:</label>  <input name="user" type="text"  v-model="name">
        <button @click="createWebSocket">加入</button>
      </div>
      <div>
        <label>消息内容:</label><textarea v-model="content"></textarea>
        <button @click="sendMessage">发送</button>
      </div>
      <div>
        当前在线列表
        <div v-for="(item,index) in onLineInfo" :key="index">{{ item }}</div>
        <input type="radio">
      </div>
      <div class="messageBox">
        <div class="q">群聊
          <div>123</div>
        </div>
        <div class="d">单聊
          <div>123</div>
        </div>
      </div>
    </div>
</template>

<script setup>
import { onMounted,ref,reactive} from 'vue';
const name = ref(null);
const content = ref(null);
const toId = ref(null)
const onLineInfo = ref(null)
let ws;

// 建立连接
function createWebSocket(){
    if(name.value!="" && name.value!=null){
        ws = new WebSocket(`ws://localhost:8080/chat/${name.value}`)
        ws.onmessage = message
        ws.onopen = open
    }else{
      alert("用户名不能为空")
    }
 }
function onMessage(e){
  console.log(e)
}
function message(e){
  console.log("message",JSON.parse(e.data))
  const message = JSON.parse(e.data)
  if(message.type === "3"){
    onLineInfo.value = message.onLinSet
  }
}
function open(e){
  console.log("open",e)
}
const sendMessage = ()=>{

  let message = {
    type:1,
    fromId:name.value,
    content:content.value,
    toId:toId.value
  }
  ws.send(JSON.stringify(message))
}

</script>

<style>
.messageBox{
  display: flex;
}
.q,.d{
  width: 200px;
  text-align: center;
}
</style>
相关推荐
数据龙傲天4 分钟前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
带带老表学爬虫33 分钟前
java数据类型转换和注释
java·开发语言
千里码aicood40 分钟前
【2025】springboot教学评价管理系统(源码+文档+调试+答疑)
java·spring boot·后端·教学管理系统
彭于晏6891 小时前
Android广播
android·java·开发语言
程序员-珍1 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
liuxin334455661 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
2401_857297912 小时前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
福大大架构师每日一题2 小时前
23.1 k8s监控中标签relabel的应用和原理
java·容器·kubernetes
金灰2 小时前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
菜鸟一皓2 小时前
IDEA的lombok插件不生效了?!!
java·ide·intellij-idea