springboot整合websocket实现广播、私聊功能

一开始是看着这篇博客写的《使用websocket简单实现多人聊天》,不过有bug(用户名使用的是在线人数作为用户名,当用户退出后,用户名是人数就会出现bug了,可以自己试试,最好是用动态参数)。

而且由于这是springboot启动的,需要额外写个配置类,具体原因可以看这篇文章https://blog.csdn.net/Xyouzi/article/details/113914558,如果使用独立的servlet容器则不需要

  1. 目录结构
    在这里插入图片描述

  2. 引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. 前端页面(index.html用于用户使用,admin.html用于发布广播)

index.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>多人在线聊天</title>
</head>
<body>
<input id="text" type="text">
<button onclick="send()">发送消息</button>
<button onclick="closeWebSocket()">退出多人聊天</button>
<hr>
<div id="message"></div>
================================================================
<script type="text/javascript">
    var websocket=null;
    let name = "";
    if('WebSocket' in window){
        name = location.href.split('?')[1].split("=")[1];
        websocket=new WebSocket("ws://localhost:8088/websocket/server/"+name);
    }
    else{
        alert('当前浏览器不支持websocket')
    }

    //连接失败事件
    websocket.onerror=function(){
        setMessageInnerHTML("连接失败!");
    }

    //连接成功事件
    websocket.onopen=function(){
        setMessageInnerHTML("成功加入聊天室");
    }


    //有消息从服务器端发送过来
    websocket.onmessage=function (event){
        setMessageInnerHTML(event.data);
    }

    //关闭事件
    websocket.onclose=function(){
        setMessageInnerHTML('退出聊天室!')
    }


    window.onbeforeunload=function(){//关闭窗口时,关闭连接
        websocket.close();
    }


    function setMessageInnerHTML(innerHTML){
        document.getElementById("message").innerHTML+=innerHTML+'<br/>'
    }

    function closeWebSocket(){
        websocket.close();
    }

    function send(){
        var message=document.getElementById('text').value;
        websocket.send(message);
    }
</script>
</body>
</html>

admin.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>多人在线聊天</title>
</head>
<body>
<input id="text" type="text">
<button onclick="send()">发送公告</button>
<hr>
<div id="message"></div>
================================================================
<script type="text/javascript">
    var websocket=null;
    let name = "";
    if('WebSocket' in window){
        name = location.href.split('?')[1].split("=")[1];
        websocket=new WebSocket("ws://localhost:8088/websocket/server/"+name);
    }
    else{
        alert('当前浏览器不支持websocket')
    }

    //连接失败事件
    websocket.onerror=function(){
        setMessageInnerHTML("连接失败!");
    }

    //连接成功事件
    websocket.onopen=function(){
        setMessageInnerHTML("可发布广播");
    }


    //有消息从服务器端发送过来
    websocket.onmessage=function (event){
        setMessageInnerHTML('已发送广播');
    }

    //关闭事件
    websocket.onclose=function(){
        setMessageInnerHTML('退出控制台!')
    }


    window.onbeforeunload=function(){//关闭窗口时,关闭连接
        websocket.close();
    }


    function setMessageInnerHTML(innerHTML){
        document.getElementById("message").innerHTML+= innerHTML + '<br/>'
    }

    function closeWebSocket(){
        websocket.close();
    }

    function send(){
        var message=document.getElementById('text').value;
        websocket.send(message);
    }
</script>
</body>
</html>

4.后端代码

@Component
@ServerEndpoint("/websocket/server/{username}")
public class MySocket {

    // 记录当前在线记录数
    private static AtomicInteger onlineCount = new AtomicInteger();

    // 存储每个客户端
    private static CopyOnWriteArraySet<MySocket> socketSet = new CopyOnWriteArraySet<MySocket>();

    private Session session;

    private String name;

    @OnOpen//连接成功
    public void onOpen(Session session, @PathParam(value = "username") String userName) {
        this.session = session;
        socketSet.add(this);
        addOnlineCount();
        this.name = "用户" + userName;//简易用户名
        try {
            if ("用户all".equals(this.name)){
                return;
            } else {
                this.sendMessage("系统:欢迎您!你是" + this.name + ",开始聊天吧!");
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("有新连接加入!当前在线人数为" + onlineCount);

    }

    @OnClose//关闭
    public void onClose() {
        subOnlineCount();
        socketSet.remove(this);
        System.out.println("一个用户离开了!当前在线人数" + onlineCount);
    }

    @OnError//连接出错
    public void onError(Session session, Throwable error) {
        System.out.println("连接发生错误");
        error.printStackTrace();
    }

    @OnMessage//当客户端有消息传来时
    public void onMessage(String message, Session session) {
        System.out.println("来自客户端的消息,由" + this.name + "发出:" + message);
        String mstemp;
        for (MySocket mySocket : socketSet) {
            System.out.println(this.name);
            if ("用户all".equals(this.name)) {
                System.out.println("--"+this.name+"--");
                mstemp = "广播:" + message;
            }
            else if (this.name.equals(mySocket.name)) { //处理客户端消息
                mstemp = "我" + ":" + message;
            }
            else {
                mstemp = this.name + ":" + message;
            }
            try {
                mySocket.sendMessage(mstemp);
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }
    }


    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }

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

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

}

还有记得在配置里改端口

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot是一个用于快速构建基于Spring框架的Java应用程序的开源框架。它简化了Spring应用程序的开发过程,并提供了许多内置的功能和插件,使得开发人员可以更加专注于业务逻辑的实现WebSocket是一种在Web浏览器和Web服务器之间建立持久连接的通信协议,能够实现实时双向通信。 要实现聊天软件的功能,可以使用Spring Boot来快速搭建项目结构和配置。首先,需要在pom.xml文件中添加WebSocket的依赖,例如使用SpringSpring WebSocket库: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 然后,需要创建一个WebSocket配置类来配置WebSocket的相关信息,例如定义访问WebSocket的端点、配置消息传输方式等。可以继承Spring提供的AbstractWebSocketMessageBrokerConfigurer类,并重写相关方法: ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/chat").withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); registry.setApplicationDestinationPrefixes("/app"); } } ``` 在上述配置类中,使用"/chat"作为WebSocket的端点,并启用了基于内存的消息代理(SimpleBroker),其中"/topic"为消息主题的前缀,"/app"为应用程序请求的前缀。 接下来,可以创建一个WebSocket处理器类来处理WebSocket的连接、关闭和消息等事件。可以实现SpringWebSocketHandler接口,并重写相关方法: ```java @Component public class ChatHandler extends TextWebSocketHandler { private static final List<WebSocketSession> sessions = new ArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { sessions.remove(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { for (WebSocketSession s : sessions) { s.sendMessage(message); } } } ``` 上述处理器类中,使用一个静态List来保存所有连接的WebSocketSession,以便将消息发送给所有已连接的客户端。 最后,在需要使用WebSocket的控制器或服务中,可以使用@Autowired注解将ChatHandler注入,并使用它来发送消息。 总结来说,通过以上的步骤,我们可以使用Spring Boot整合WebSocket实现聊天软件的功能。当有新的WebSocket连接建立时,我们将其保存在一个静态List中,并在收到消息时将消息发送给所有的连接。通过Spring Boot的简化开发流程和WebSocket的实时双向通信特性,实现了一个简单的聊天软件。 ### 回答2: Spring Boot是一个用于开发Java应用程序的框架,它能够帮助开发人员更快速、更简洁地构建应用程序。WebSocket是HTML5新增的一种协议,它能够在客户端与服务器之间建立持久的双向通信连接,实时地传输数据。 要实现聊天软件的功能,首先需要导入Spring Boot和WebSocket的相关依赖。在pom.xml文件中添加Spring Boot和WebSocket的依赖项。 在Spring Boot的主类中,使用@EnableWebSocket注解启用WebSocket的支持。编写一个WebSocket处理器类,继承自TextWebSocketHandler,并重写其中的方法。在onTextMessage方法中处理接收到的文本消息,在sendMessage方法中处理发送消息。 配置WebSocket的映射路径和处理器,使用@Configuration注解和实现WebSocketConfigurer接口。重写registerWebSocketHandlers方法,设置WebSocket的映射路径和处理器。 在前端界面中,使用JavaScript代码连接WebSocket服务器,并处理接收消息和发送消息的逻辑。通过WebSocket对象的onmessage方法处理接收到的消息,并将消息显示在聊天界面上。通过WebSocket对象的send方法发送消息给服务器。 通过以上步骤,就可以实现Spring Boot和WebSocket整合,从而实现聊天软件的功能。开发人员可以根据具体的需求,进一步完善聊天软件的功能,例如用户名的验证、消息的存储和管理等。 总结起来,使用Spring Boot和WebSocket可以快速、简洁地实现聊天软件。借助Spring Boot的开发效率和WebSocket的实时通信功能,开发人员能够轻松地构建出高效、稳定的聊天软件。 ### 回答3: Spring Boot 是一个基于 Spring 框架的开源服务端开发框架,提供了快速开发和方便部署的特性。WebSocket 是一种基于TCP协议的双向通信协议,通过浏览器与服务器建立持久连接,实现实时通信。 使用 Spring Boot 整合 WebSocket 实现聊天软件的步骤如下: 1. 创建一个 Spring Boot 项目,引入 WebSocket 依赖包。 2. 在配置类上添加 `@EnableWebSocket` 注解以启用 WebSocket 功能。 3. 创建一个 WebSocket 处理器类,继承自 `TextWebSocketHandler`,覆写其中的方法,如 `handleTextMessage()` 和 `afterConnectionEstablished()`。 4. 在 `handleTextMessage()` 方法中,获取客户端发送的消息,处理后将消息发送给所有连接到服务器的客户端。 5. 在 `afterConnectionEstablished()` 方法中,可以处理客户端连接成功后的逻辑。 6. 创建一个控制器类,处理客户端与服务器的交互,如发送消息、接收消息等。 7. 在控制器类中,使用 `@Autowired` 注入 WebSocket 处理器类的对象,并通过该对象发送消息给客户端。 8. 在前端页面中使用 JavaScript 创建 WebSocket 连接,并实现相应的回调函数,实现与服务器的实时通信。 通过以上步骤,可以实现一个简单的聊天软件。用户在页面上发送消息,消息通过 WebSocket 连接发送到服务器,服务器将消息广播给所有客户端,实现实时聊天功能。 总之,借助 Spring Boot 提供的便利性和 WebSocket 协议的实时通信特性,可以快速实现一个聊天软件。不仅可以在浏览器上实现聊天功能,还可以通过移动端等其他客户端实现跨平台的聊天应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值