Java 实现使用 Websocket 发送消息

这篇具有很好参考价值的文章主要介绍了Java 实现使用 Websocket 发送消息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

  • 需求背景:之前做了个楼栋房间数量出租了多少,需要在数据大屏上实时展示
  • 解决方案:以切面拦截出租接口,当有房间出租时重新查询相关数据,封装好用websocket实时传送前端展示

提示:以下是本篇文章正文内容,下面案例可供参考

一、websocket 简介

WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

二、websocket 如何使用

1.引入依赖包

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

2.创建 WebSocketConfig

package com.alpari.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * @author wangrui
 * @date 2023/11/8
 **/
@Configuration
@EnableWebSocket
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpoint() {
        return new ServerEndpointExporter();
    }

    /**
     * 注意事项:
     * WebSocket启动的时候优先于spring容器,从而导致在WebSocketServer中调用业务Service会报空指针异常
     * 所以需要在WebSocketServer中将所需要用到的service给静态初始化一下
     * 此处提前注入
     */
//    @Autowired
//    private void setXxx(XxxService xxxService) {
//        WebSocketServer.xxxService = xxxService;
//    }
}

3.创建 WebSocketServer

package com.alpari.config;

import lombok.extern.slf4j.Slf4j;
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.concurrent.CopyOnWriteArraySet;

/**
 * @author wangrui
 * @date 2023/11/8
 * @description: 若在此类中直接调用service方法失败,需要加上:public static XxxService xxxService; 另外在config中注入实例
 **/
@Slf4j
@Component
@ServerEndpoint(value = "/websocket/{userId}")
public class WebSocketServer {

    /**
     * 当前连接数
     */
    private static int onlineCount = 0;

    /**
     * concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象
     */
    private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();

    /**
     * 与某个客户端的连接会话,需要通过它来给客户端发送数据
     */
    private Session session;

    /**
     * 接收的用户id
     */
    private String userId;

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        this.session = session;
        webSocketSet.add(this);
        addOnlineCount();        //在线数加1
        log.info("有新连接加入!当前在线人数为" + getOnlineCount());
        this.userId = userId;
        try {
            sendMessage("连接成功");
        } catch (IOException e) {
            log.error("websocket IO异常", e);
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        webSocketSet.remove(this);
        subOnlineCount();               //在线数减1
        log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message) {
        log.info("来自客户端的消息:" + message);
        //群发消息
        for (WebSocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                log.error("发送消息失败", e);
            }
        }
    }

    /**
     * @param error 错误
     */
    @OnError
    public void onError( Throwable error) {
        log.error("发生错误", error);
    }

    /**
     * 发送消息
     * @param message 消息
     * @throws IOException 异常
     */
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }

    /**
     * 群发自定义消息
     */
    public static void sendInfo(String message, @PathParam("userId") String userId) {
        log.info("消息内容:" + message);
        for (WebSocketServer item : webSocketSet) {
            try {
                //这里可以设定只推送给这个sid的,为null则全部推送
                if (userId == null) {
                    item.sendMessage(message);
                } else if (item.userId.equals(userId)) {
                    item.sendMessage(message);
                }
            } catch (IOException e) {
                log.error("消息发送失败", e);
            }
        }
    }

    /**
     * 获取在线人数
     * @return 在线人数
     */
    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    /**
     * 在线人数加一
     */
    public static synchronized void addOnlineCount() {
        WebSocketServer.onlineCount++;
    }

    /**
     * 在线人数减一
     */
    public static synchronized void subOnlineCount() {
        WebSocketServer.onlineCount--;
    }
}

4.在线测试

在线ws测试地址:http://www.jsons.cn/websocket/

  • 输入测试

java 发送websocket消息,Java,java,websocket,开发语言

  • 后端返回的结果

java 发送websocket消息,Java,java,websocket,开发语言

5.模拟消息发送

/**
 * 切面拦截数据模拟给指定用户或全部用户发消息
 */
public void sendMessage(String userid) {
    // 此处模拟数据大屏推送,以切面方式拦截相关接口,若数据发生变化,则将数据推送,不传id则全部发送
    String msg = "模拟数据";
    WebSocketServer.sendInfo(msg, userid);
    log.info("发送消息成功,消息内容:{},接收人:{}", msg, userid);
}

总结

当凉意与秋雨结伴;当黄叶与晨露相依;当冷月共霞光一色;当大雁也打点南归,我的祝福伴随着冬至的到来飘然而至:天气凉了,请记得添加衣裳!

java 发送websocket消息,Java,java,websocket,开发语言文章来源地址https://www.toymoban.com/news/detail-843672.html

到了这里,关于Java 实现使用 Websocket 发送消息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 构建websocket客户端,构建wss客户端,使用wss连接,并发送数据到服务器端,接收服务器端消息

    Java 构建websocket客户端,构建wss客户端,使用wss连接,并发送数据到服务器端,接收服务器端消息 回调函数处理

    2024年02月13日
    浏览(61)
  • Java实现websocket发送长文本问题

    Java实现websocket时,每次发送的文本长度默认限制在8k范围内,原因是 org.apache.tomcat.websocket.WsSession进行了设置   如果发送超过8k的消息,就会报错: 那么要实现类似发送文件的base64,网上有两种方式实现,第一种是实现ServletContextInitializer接口,对onStartup进行重载,大体代码如

    2024年02月11日
    浏览(36)
  • 【iOS】—— 实现WebSocket发送消息(SocketRocket第三方库的使用和解析)

    偶然之间了解到了利用WebSocket实现后端和前端的相互发送消息,就查了查在iOS里这个东西该怎么写,用舍友写的接口简单实现了两个用户的通信。 WebSocket 是一种在 Web 应用程序中实现双向通信的协议。它允许客户端和服务器之间建立一个持久性的连接,以便可以在任何时间点

    2024年02月15日
    浏览(56)
  • SpringBoot实现WebSocket发送接收消息 + Vue实现SocketJs接收发送消息

    1、https://www.mchweb.net/index.php/dev/887.html 2、https://itonline.blog.csdn.net/article/details/81221103?spm=1001.2101.3001.6661.1utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~default-1-81221103-blog-121078449.pc_relevant_aadepth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~default-1-81221103-blog-12107

    2024年02月05日
    浏览(47)
  • 消息服务应用1——java项目使用websocket

    在当前微服务项目中,由于业务模块众多,消息服务的使用场景变得异常活跃。而WebSocket由于其自身的可靠性强,实时性好,带宽占用更小的优势,在实时通讯应用场景中独占鳌头,加上HTML5标准的普及流行,在前端和后端开发中应用异常广泛。 一.关于WebSocket 1.WebSocket是什么

    2024年04月25日
    浏览(30)
  • 使用WebSocket在前端发送消息

    在现代Web开发中,WebSocket提供了一种在用户的浏览器和服务器之间进行全双工通信的方法。这意味着服务器可以直接向客户端发送消息,而不需要客户端先请求数据。这种通信方式对于需要实时数据传输的应用(如在线游戏、实时通知系统等)非常有用。 WebSocket API 定义了一

    2024年04月26日
    浏览(38)
  • 前端如何使用WebSocket发送消息

    WebSocket是一种在Web应用程序中实现实时双向通信的协议。相比传统的HTTP协议,WebSocket提供了更高效、更快速的双向通信方式,可以在客户端和服务器之间实时交换数据。本文将详细介绍前端如何使用WebSocket发送消息,包括创建WebSocket对象、监听WebSocket事件、发送消息以及关闭

    2024年02月11日
    浏览(40)
  • qt websocket 通讯实现消息发送接收

    websocket 是基于 TCP socket 之上的应用层, 解决 HTML 轮询连接的问题,实现客户端与服务端长连接, 实现消息互相发送,全双工。 服务端, 使用 QT 教程demo chatserver.h chatserver.cpp main.cpp 客户端 clientwidget.h clientwidget.cpp websocketclient.h websocketclient.cpp

    2024年02月15日
    浏览(46)
  • 【前端系列】前端如何使用websocket发送消息

    今天来学习一下前端如何使用websocket发送消息 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它可以让客户端和服务器之间进行实时的双向通信。与传统的 HTTP 请求不同,WebSocket 使用了一个长连接,在客户端和服务器之间保持持久的连接,从而可以实时地发送和接

    2024年02月11日
    浏览(47)
  • 前端使用websocket发送消息,建立连接(详细)。【前端】

    序言 今天来学习一下前端如何使用websocket发送消息 1.1 什么是WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它可以让客户端和服务器之间进行实时的双向通信。与传统的 HTTP 请求不同,WebSocket 使用了一个长连接,在客户端和服务器之间保持持久的连接,从

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包