Vue+Java 通过websocket实现服务器与客户端双向通信操作

一、介绍

WebSocket是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。在传统的HTTP请求中,双方之间的数据传输是单向的,即客户端向服务端发送请求,服务端对请求进行处理后把处理结果(响应)返回给客户端。WebSocket 协议在建立连接后,双方都可以独立的向对方发送数据,而不是像HTTP请求那样只能由客户端向服务端发送数据。这里,我们将演示如何在Vue和Java应用中使用 WebSocket 来实现服务端与客户端的双向通信。

二、Vue端使用WebSocket

在Vue应用中,我们可以使用standard WebSocket API。 在这个示例中,我们将演示如何在Vue组件中使用WebSocket来处理消息。

<template>
    <div>
        <h3>WebSocket Demo</h3>
        <button @click="connect()">Connect</button>
        <button @click="disconnect()">Disconnect</button>
        <div v-for="(message, index) in messages" :key="index">{{ message }}</div>
        <div v-if="error" class="error">{{ error }}</div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            messages: [],
            socket: null,
            error: null
        }
    },
    methods: {
        connect() {
            if (this.socket && this.socket.readyState == 1) {
                return
            }
            const socket = new WebSocket('ws://localhost:8080/ws-server-endpoint')
            socket.onopen = (event) => {
                console.log('WebSocket opened:', event)
            }
            socket.onmessage = (event) => {
                console.log('WebSocket message received:', event)
                this.messages.push(event.data)
            }
            socket.onerror = () => {
                this.error = 'WebSocket error occurred.'
            }
            socket.onclose = () => {
                this.error = 'WebSocket closed.'
            }
            this.socket = socket
        },
        disconnect() {
            if (this.socket && this.socket.readyState == 1) {
                this.socket.close()
                this.socket = null
                console.log('WebSocket disconnected')
            }
        }
    }
}
</script>

在上面的代码示例中,我们在Vue组件中定义了一些方法用于连接和断开WebSocket连接。我们还定义了一个数组来存储消息,并使用 v-for 指令来渲染消息列表。在创建连接时,我们将 WebSocket 的地址设置为 ws://localhost:8080/ws-server-endpoint,这需要与Java代码中设置的地址相同。

当连接建立后,我们使用 onmessage 方法来接收来自服务器的消息并将其添加到消息列表中。 WebSocket 连接的状态变化通过 onopenonerroronclose 事件进行监控。在连接关闭后,我们将解除该组件中的Websocket 内存对象的引用。 在下面的Java代码段中,我们将处理来自客户端的连接请求并为连接创建一个WebSocketServer。

三、Java端实现WebSocketServer

我们将把WebSocket 处理放在Java应用中。在这个示例中,我们使用Java EE6规范给出的Api,即javax.websocket

@ServerEndpoint(value = "/ws-server-endpoint")
public class WSServerEndpoint {

    private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<>());

    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
        System.out.println("WebSocket opened: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        for (Session s : sessions) {
            if (s.isOpen()) {
                s.getBasicRemote().sendText(message);
            }
        }
    }

    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
        System.out.println("WebSocket closed: " + session.getId());
    }

    @OnError
    public void onError(Throwable t) {
        System.out.println("WebSocket error occurred: " + t.getMessage());
    }
}

在上面的代码示例中,我们使用 @ServerEndpoint 注解标记来表明这是一个 WebSocket 服务器端点。在 WSServerEndpoint 类中,我们使用 @OnOpen 方法来处理连接,并将使用 synchronizedSet 来保证线程安全。在 @OnMessage 方法中,我们将处理客户端发送的消息并将其传递给所有连接。在 @OnClose 方法中,我们将从 sessions 集合中删除关闭的会话,并记录其 ID。最后,在 @OnError 注解中,我们将处理任何错误。这些函数是Java中调用WebSocket API时必需的。

实现WebSocket后,我们现在将展示如何将WebSocket发送给客户端。我们还将展示WebSocket处理客户端连接请求的代码。

@Named
public class IndexController {
    @Inject
    private WSServerEndpoint wsServerEndpoint;

    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        System.out.println("Message received: " + message);
        wsServerEndpoint.broadcast(message);
    }
}

在上面的代码示例中,我们使用 @Inject 来注入 WSServerEndpoint 对象,并使用 @OnMessage 来处理来自客户端的消息。 在其中,我们将消息广播到所有连接会话中,这可以通过调用 WSServerEndpoint#broadcast() 方法实现。 这些方法提供了在连接客户端和服务器之间双向发送数据的功能。

四、示例

我们现在可以使用类似于这样的代码来跑我们的示例:

public class WebSocketExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        Session session = container.connectToServer(new Endpoint() {
            @Override
            public void onOpen(Session session, EndpointConfig endpointConfig) {
                try {
                    session.getBasicRemote().sendText("Java WebSocket is now open.");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }, new URI("ws://localhost:8080/ws-server-endpoint"));
        session.addMessageHandler(String.class, System.out::println);
        session.getBasicRemote().sendText("Java WebSocket connected.");
        Thread.sleep(5000);
        session.close();
    }
}

该示例将连接到一个WebSocket 服务器端点,并在建立连接后发送消息。我们还为 WebSocket 对象设置了一个消息处理程序,以便在接收到消息时将其输出到控制台。 最后,在5秒后,我们将关闭连接。

以上就是Vue和Java使用WebSocket来实现服务端与客户端之间的双向通信的攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue+Java 通过websocket实现服务器与客户端双向通信操作 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue开发之封装上传文件组件与用法示例

    Vue开发之封装上传文件组件与用法示例 一、概述 在Vue项目中,我们经常需要使用到上传文件的功能,为了提高代码的可复用性并减少冗余代码,我们可以封装一个通用的上传文件组件。本篇攻略将介绍如何封装上传文件组件以及如何在Vue项目中使用该组件。 二、上传文件组件的封装 创建 UploadFile.vue 组件文件,并添加如下代码: <template&g…

    Vue 2023年5月28日
    00
  • 详解基于Vue cli生成的Vue项目的webpack4升级

    下面我将详细讲解“详解基于Vue CLI生成的Vue项目的webpack4升级”的完整攻略,包括具体步骤和示例说明。 1. 升级准备 1.1. 确认Vue CLI版本 首先需要确认当前使用的Vue CLI版本是否是3.x版本。如果不是3.x,需要先进行升级。可以通过以下命令检查版本: vue –version 如果版本低于3.x,可以通过以下命令进行升级:…

    Vue 2023年5月28日
    00
  • 详解Vue computed计算属性是什么

    下面我来详细讲解“详解Vue computed计算属性是什么”的完整攻略。 什么是computed计算属性? 在Vue.js中,computed是一个计算属性,即Vue自带的一种通用的计算方式。它是在模板中进行数据展示和操作的时候,可以使用的一种虚拟数据属性,也可用来监听数据的变化。 计算属性实际上就是对已经存在的数据进行处理,通过已有的数据给出新的计算结果…

    Vue 2023年5月27日
    00
  • Vue echarts画甘特图流程详细讲解

    下面我将详细讲解“Vue echarts画甘特图流程详细讲解”的完整攻略。 1. 甘特图简介 甘特图是一种常用于项目管理的图表类型,用于展示任务的时间轴,显示各个任务的开始时间、结束时间和持续时间。它能够清晰地展示每个任务的进展情况,帮助团队掌握项目进展,及时协调、调整工作计划和资源分配。 2. 准备工作 在使用 Vue 和 echarts 画甘特图之前,我…

    Vue 2023年5月29日
    00
  • Vue全局事件总线你了解吗

    当进行 Vue 项目开发时,有时需要在组件之间进行通信,常见的方式有props、自定义事件、Vuex等。除了这些方式,还可以使用Vue的全局事件总线来实现组件之间的通信。 什么是Vue全局事件总线? Vue全局事件总线是通过Vue实例来实现的全局事件总线。Vue实例是一个事件代理,它中转和分发事件通知,从而实现各组件之间的通信。它的实现是通过创建一个Vue实…

    Vue 2023年5月29日
    00
  • vue组件库的在线主题编辑器的实现思路

    让我来详细讲解一下“Vue组件库的在线主题编辑器的实现思路”的完整攻略。 简介 Vue组件库的在线主题编辑器可以让用户在浏览器中快速地在前端组件之间切换不同的主题,实现对组件样式的高效编辑和定制。实现思路主要分为以下几个步骤: 构建基于Vue的组件库 实现主题JSON文件的存储和读取 实现在浏览器中编辑主题的可视化交互界面 实现主题对组件的动态更换 下面我针…

    Vue 2023年5月28日
    00
  • Vue模拟响应式原理底层代码实现的示例

    下面我将为你详细讲解“Vue模拟响应式原理底层代码实现的示例”的完整攻略。 什么是Vue模拟响应式原理 在Vue框架中,响应式原理是Vue实现数据绑定的重要原理,它通过数据劫持、观察者模式等技术实现了数据的变化能够自动地触发视图的更新。 在实际开发中,我们有时需要自己实现响应式原理,并且Vue框架的响应式原理实现也是值得我们去学习的。 实现方法 Vue官方提…

    Vue 2023年5月27日
    00
  • 如何在Vue中使用debouce防抖函数

    当我们在Vue组件中使用一些高频操作时,例如input事件的实时搜索,我们会发现输入一个字母就会发送一次请求,导致不必要的请求和资源浪费,这时候可以通过引入debounce防抖函数进行优化。下面是关于在Vue中使用debounce防抖函数的完整攻略: 1. 安装lodash debounce函数通常是使用lodash库中的_.debounce函数来实现的,因…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部