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>
相关推荐
Cosmoshhhyyy11 分钟前
LeetCode:3083. 字符串及其反转中是否存在同一子字符串(哈希 Java)
java·leetcode·哈希算法
AI人H哥会Java24 分钟前
【Spring】基于XML的Spring容器配置——<bean>标签与属性解析
java·开发语言·spring boot·后端·架构
计算机学长felix28 分钟前
基于SpringBoot的“大学生社团活动平台”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·后端
sin220128 分钟前
springboot数据校验报错
spring boot·后端·python
开心工作室_kaic34 分钟前
springboot493基于java的美食信息推荐系统的设计与实现(论文+源码)_kaic
java·开发语言·美食
缺少动力的火车36 分钟前
Java前端基础—HTML
java·前端·html
loop lee44 分钟前
Redis - Token & JWT 概念解析及双token实现分布式session存储实战
java·redis
ThetaarSofVenice1 小时前
能省一点是一点 - 享元模式(Flyweight Pattern)
java·设计模式·享元模式
InSighT__1 小时前
设计模式与游戏完美开发(2)
java·游戏·设计模式