WebSocket全栈搭建(Java + Vue2) 上

这篇具有很好参考价值的文章主要介绍了WebSocket全栈搭建(Java + Vue2) 上。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

路途漫漫,行则将至

为什么使用WebSocket

一般来讲,我们传统的前后端分离设计下,前后端通讯一般都是前端发送一个http请求,之后后端处理,然后返回给前端,这样的设计下,其实就是类似于一种单工的通信模式,这种模式下可能无法满足一些特定的场景:

  • 比如我们存在一个后台的定时任务,每天晚上检查货物的存储数量,当存储数量低于阈值的时候,需要给业务人员报警,此时我们就需要后端主动发送消息给前端。
  • 或者前端发起了一个复杂而庞大的处理任务,后端可能需要一个较长的处理时间(比如五分钟),此时如果前端页面忙等,业务人员很可能会认为页面卡住了,或者浏览器有问题,我们更好的解决方案应该是后端每处理完一定的任务节点就向前端发送一个信号,并展示给用户,如 查找人员中 -> 数据解析中 -> 正在计算大区出货量…
  • 也或者我们后端存在一些数据会不定期的变化,而这些数据需要及时发送给前端进行展示。

获取有人会说,轮询也可以解决上述问题,是的,但轮询也存在一定的问题,例如轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开),同时有些消息存在着时间分布不均的情况,例如一些变化数据在早上变化频繁而夜间变化稀疏,如果轮询间隔一直很短,对于夜间而言就是一种资源的浪费。或者我们存在一些数据10秒内变化了三次,但我们轮询时间为15秒,这样的话我们就有可能漏掉一些数据。

什么是WebSocket

WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

其他特点包括:

(1)建立在 TCP 协议之上,服务器端的实现比较容易。

(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

(3)数据格式比较轻量,性能开销小,通信高效。

(4)可以发送文本,也可以发送二进制数据。(一般我们使用Json的形式传递数据)

(5)没有同源限制,客户端可以与任意服务器通信。

(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

本系列将从前后端两个方面分别介绍搭建过程,本文主要介绍依赖于java8的后端实现过程,下一篇文章将会整体介绍依赖于vue2与vuex的前端websocket实现。

后端服务部署

依赖搭建

pom.xml

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

配置项管理

config

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

websocket总线

所有服务目标为myWs的连接建立请求,都将途径此节点,并进行注册和统一管理,我们可以建立多个总线,甚至我们可以为每一个请求都单独设立一个总线进行分开管理。
但是值得注意的是,我们在总线中进行注册时,需要依据一个唯一标识来对不同的session进行区分,这个标识可以是用户姓名,也可以是随机数,我们需要对唯一标识进行合理的管理和存储,以防出现广播情况。
不需要的session建议及时关闭。
用户刷新页面时(F5)将会断开所有session

@ServerEndpoint("/myWs")
@Component
public class WsServerEndpoint {

    private static Set<Session>sessions= new HashSet<>();

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

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

    private static ObjectMapperobjectMapper= new ObjectMapper();

		/**
		     *连接成功
		*@paramsession
		*/
		@OnOpen
    public void onOpen(Session session) throws IOException {
			sessions.add(session);
	    String owner = new ArrayList<>(session.getRequestParameterMap().values()).get(0).get(0).trim();
			sessionOwners.put(session, owner);
      System.out.println("连接成功");
//    session.getBasicRemote().sendText("Hello from the server!");
			ownerSessions.put(owner, session);
    }

		/**
		     *连接关闭
		*@paramsession
		*/
		@OnClose
    public void onClose(Session session) {
        System.out.println("连接关闭");
				sessions.remove(session);
				ownerSessions.remove(sessionOwners.get(session));
				sessionOwners.remove(session);
    }

    @OnMessage
    public void onMessage(String message) {
        // 处理来自WebSocket客户端的消息
        System.out.println("Received message: " + message);
    }

    public static void sendMessage(String message, String owner) {
        System.out.println("sendMsg Here");
        if (ownerSessions.containsKey(owner)) {
            Session session =ownerSessions.get(owner);
            session.getAsyncRemote().sendText(message);
        }
    }
    // 发送对象给前端
    public static void sendObjectToClient(String owner, Object object) {
        Session session = null;
        if (ownerSessions.containsKey(owner)) {
            session =ownerSessions.get(owner);
        } else {
            return;
        }
        try {
            String json =objectMapper.writeValueAsString(object);
            session.getBasicRemote().sendText(json);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我们在这里发送object时,依旧是使用sendtext,而不是sendobject
很少使用session.getBasicRemote().sendObject()方法的原因是该方法并不是标准的WebSocket API的一部分。在Java中,WebSocket API提供了session.getBasicRemote().sendText()session.getBasicRemote().sendBinary()方法来发送文本数据和二进制数据。这两个方法是标准的WebSocket API方法,被广泛支持和使用。

另外,sendObject()方法要求发送的对象必须是可序列化的,这意味着对象需要实现java.io.Serializable接口。但并不是所有对象都可以轻松地实现序列化,有些对象可能包含非序列化的成员变量或方法,或者依赖于特定的运行时环境。因此,将对象转换为字符串或其他可序列化的格式,然后使用sendText()sendBinary()方法发送数据更为常见和可靠。

通过将对象转换为字符串或其他可序列化的格式,可以确保发送的数据能够被接收方正确解析和处理。常见的做法是将对象转换为JSON字符串,这样接收方可以方便地解析和处理该字符串。

到这里,我们基本上就已经成功的在我们的后端项目中引入WebSocket功能了,但是这里也只是万里长征第一步,后续我们还需要做很多其他的工作,如session注册session管理消息定向发送消息广播 等等相关的工作。这些的实现都并不复杂也有很多的实现方式,简单的实现只要合理的利用线程安全的Map进行管理即可。

另外,出于规范化的数据管理,推荐在前后端WebSocket通信时,定义标准的通讯类,个人推荐通讯类中应包含 T 泛型对象,String 消息id,Long 时间戳,String 消息类型。这些作为基础数据,并以此扩展。

本文之中不足之处还请大佬多多指教文章来源地址https://www.toymoban.com/news/detail-796940.html

到了这里,关于WebSocket全栈搭建(Java + Vue2) 上的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • websocket实现聊天室(vue2 + node)

    需求分析如图: 搭建的项目结构如图: 前端步骤: vue create socket_demo (创建项目) views下面建立Home , Login组件 路由里面配置路径 Home组件内部开启websocket连接 前端相关组件代码: Login组件 Home组件 router/index.js 后端步骤: 在项目外层创建server文件夹(src目录同级) npm init -y创建

    2024年01月22日
    浏览(55)
  • Java实现森林火灾预警系统 websocket+JAVA+Vue+SpringBoot+MySQL

    基于websocket+Vue+SpringBoot+MySQL的森林火灾预警系统,包含园区数据模块、温度传感器模块、烟雾传感器模块、园区监控模块、园区报警历史模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,森林火

    2024年02月01日
    浏览(40)
  • Java+Vue实现聊天室(WebSocket进阶-聊天记录)

    WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服

    2024年02月11日
    浏览(65)
  • SpringBoot和Vue2集成WebSocket,实现聊天室功能

    springboot集成websocket实现聊天室的功能。如有不足之处,还望大家斧正。

    2024年01月23日
    浏览(47)
  • vue2 封装 webSocket 开箱即用(或 uni.connectSocket)

    第一步:    下载 webSocket  第二步:   需要在 main.js 中 引入  第三步:     封装相关的连接和断开    相关代码!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  第四步:  引入使用 到这步接收信息已经OK了(记得和后端配合)    使用

    2024年02月09日
    浏览(47)
  • 完整教程:Java+Vue+Websocket实现OSS文件上传进度条功能

    文件上传是Web应用开发中常见的需求之一,而实时显示文件上传的进度条可以提升用户体验。本教程将介绍如何使用Java后端和Vue前端实现文件上传进度条功能,借助阿里云的OSS服务进行文件上传。 后端:Java、Spring Boot 、WebSocket Server 前端:Vue、WebSocket Client 安装依赖 UploadF

    2024年02月05日
    浏览(118)
  • Vue2+Echarts+SpringBoot+Websocket+Scheduled实现大屏图表数据实时展示

    近期在学习websocket的相关技术,用于做前后端的数据实时交互,结合网上资料和个人理解,整理了一个小白入门案例,不喜勿喷!!!!! WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议) 它实现了浏览器与服务器全双工通信,能更好的节省服务器资源

    2024年02月20日
    浏览(55)
  • 【vue3】前端应用中使用WebSocket与服务器进行通信并管理连接状态。

    1、写一个hook函数 url 是WebSocket的服务器地址,其中 Math.random() 用于生成一个随机数,以避免缓存问题。 onConnected 、 onDisconnected 和 onError 是连接建立、断开和出错时的回调函数,你可以根据实际需求来定义它们。 onMessageDefault 是当接收到消息时的默认处理函数,在这里将接收

    2024年02月09日
    浏览(62)
  • Java Websocket发送文件给Vue客户端接收并上传,实现检测U盘插入并将指定文件上传到服务器功能

    应用环境: B/S架构 需求描述: 1、判断U盘接入 2、扫描U盘指定文件,将满足条件的文件发送给服务器 解决思路: 1、因为bs架构,无法获取本机资源,计划在U盘所在服务器部署websocket服务 2、websocket服务扫描u盘,拿到指定文件,使用session.getBasicRemote().sendBinary(data)分批发送二

    2024年01月15日
    浏览(56)
  • 什么是 WebSocket?Java 中如何实现 WebSocket?

    WebSocket 是一种新型的网络协议,它允许客户端和服务器之间进行双向通信,可以实现实时数据交互。WebSocket 协议是基于 HTTP 协议的,使用标准的 TCP 连接,可以在客户端和服务器之间建立一条持久化的连接,而不需要像 HTTP 协议那样每次请求都需要重新建立连接。 WebSocket 协

    2024年02月16日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包