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

yizhihongxing

一、介绍

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 + webpack如何绕过QQ音乐接口对host的验证详解

    如何绕过QQ音乐接口对host的验证? 针对一些特定的服务器,如QQ音乐接口,可能对host字段的验证比较严格。此时我们需要采取一些手段来进行绕过。 本文针对vue + webpack项目,将详细讲解如何绕过QQ音乐接口对host的验证。 方案一:使用webpack-dev-server的proxyTable 我们可以在webpack配置文件中的devSer…

    Vue 2023年5月28日
    00
  • vue+axios+promise实际开发用法详解

    vue+axios+promise实际开发用法详解 什么是axios和promise axios axios是一个基于Promise用于浏览器和node.js的HTTP客户端。它具有以下特征: 支持浏览器和 node.js 支持 Promise API 拦截请求和响应 转换请求和响应数据 Promise Promise是一种用于异步编程的语言特性,它可以让我…

    Vue 2023年5月28日
    00
  • Vue中render函数调用时机与执行细节源码分析

    Vue中的render函数是用来生成虚拟DOM(Virtual DOM)的函数。当组件的状态发生改变时,Vue会重新执行render函数,生成新的虚拟DOM,并通过比对新旧虚拟DOM的差异,最终更新视图。在Vue的生命周期中,render函数执行的时机与执行细节如下: 执行时机 初始化时执行 组件的render函数在组件初始化时执行一次,用来生成组件的初始虚…

    Vue 2023年5月28日
    00
  • vue中对虚拟dom的理解知识点总结

    下面是关于“Vue中对虚拟DOM的理解知识点总结”的详细攻略。 什么是虚拟DOM 虚拟DOM是JavaScript对象,它是由Vue框架所提供的一种机制,可以在浏览器的内存中构建一个虚拟的DOM树,通过Diff算法找出需要更新的地方,再将这些更新应用到真正的DOM上,从而最大限度地减少Dom操作对性能的影响。 虚拟DOM相当于是对真实DOM的一层抽象,它可以…

    Vue 2023年5月28日
    00
  • VUE + UEditor 单图片跨域上传功能的实现方法

    下面是详细讲解“VUE + UEditor 单图片跨域上传功能的实现方法”的完整攻略。 准备工作 首先,我们需要准备以下内容: vue.js:前端框架 UEditor:富文本编辑器 proxy:图片上传代理 其中,UEditor 和 proxy 是必备的,vue.js 可以根据个人喜好选择其他前端框架。 实现方法 1. 在Vue中引入UEditor 我们需要…

    Vue 2023年5月28日
    00
  • Vue CLI4 Vue.config.js标准配置(最全注释)

    下面是详细讲解“Vue CLI4 Vue.config.js标准配置(最全注释)”的完整攻略。 什么是Vue CLI4? Vue CLI是Vue.js官方提供的一个“脚手架”工具,它可以帮助我们快速构建Vue.js项目的基础代码结构。 Vue CLI4是Vue CLI的一个全新版本,它提供了更加简单、灵活、功能更加强大的CLI工具,使得我们可以更加方便地使用…

    Vue 2023年5月28日
    00
  • 深入浅析vue-cli@3.0 使用及配置说明

    深入浅析vue-cli@3.0 使用及配置说明 什么是vue-cli@3.0 vue-cli@3.0 是 Vue.js 的脚手架工具,它可以帮助我们快速生成一个基于 Vue.js 的项目开发所需的目录和文件,并提供了一些常用的功能,例如:本地开发调试、构建打包、自动化部署等。 vue-cli@3.0 相对于之前的版本,最大的改变是它采用了完全重构的架构,即把…

    Vue 2023年5月28日
    00
  • 详解使用Vue Router导航钩子与Vuex来实现后退状态保存

    本文将详细讲解如何使用Vue Router导航钩子与Vuex来实现后退状态保存的解决方案。 什么是导航钩子? 导航钩子是Vue Router提供的一种功能,用于在路由导航过程中拦截操作,触发特定的函数。导航钩子包含全局导航钩子和路由级别导航钩子。 对于全局导航钩子,可以用于全局拦截路由导航,比如用户未登录时跳转到登录页面。而对于路由级别导航钩子,可以用于针对…

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