Java应用层协议WebSocket实现消息推送

下面是关于Java应用层协议WebSocket实现消息推送的详细攻略。

WebSocket简介

WebSocket是一种应用层协议,它是用于在客户端和服务器之间进行双向通信的标准。它是在同一个TCP连接上,以低延迟和高吞吐量的方式进行通信的协议,可以为Web应用程序提供实时通信和数据流的创建。

Java实现WebSocket

Java实现WebSocket,最常用的是javax.websocket API和spring-websocket框架。下面我们分别介绍这两种方式。

javax.websocket API

javax.websocket API是Java EE7中添加的Java WebSocket规范的接口,它为Java开发人员提供了一种实现WebSocket的标准方式。下面是一个简单的示例代码。

服务端代码

@ServerEndpoint("/websocket/{nickname}")
public class ChatEndpoint {

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

    /**
     * 有新连接进入
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("nickname") String nickname) {
        sessions.add(session);
        String message = "欢迎" + nickname + "加入聊天室!";
        broadcast(message);
    }

    /**
     * 关闭连接
     */
    @OnClose
    public void onClose(Session session, @PathParam("nickname") String nickname) {
        sessions.remove(session);
        String message = nickname + "已离开聊天室!";
        broadcast(message);
    }

    /**
     * 收到客户端消息后调用的方法
     */
    @OnMessage
    public void onMessage(String message, Session session, @PathParam("nickname") String nickname) {
        String info = nickname + ":" + message;
        broadcast(info);
    }

    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
        error.printStackTrace();
    }

    /**
     * 群发消息
     */
    private void broadcast(String message) {
        for (Session session : sessions) {
            try {
                session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

客户端代码

var ws = new WebSocket("ws://localhost:8080/websocket/" + nickname);
ws.onopen = function() {
    console.log("连接成功");
}
ws.onmessage = function(event) {
    console.log(event.data);
}
ws.onclose = function() {
    console.log("连接关闭");
}
ws.onerror = function() {
    console.log("连接出错");
}
function send() {
    var message = document.getElementById("message").value;
    ws.send(message);
}

以上示例代码实现了一个简单的聊天室,服务端使用Java实现WebSocket,客户端使用JavaScript的WebSocket API。

Spring WebSocket

Spring WebSocket是基于javax.websocket API实现的,所以它也是一种使用Java实现WebSocket的方式。相较于javax.websocket API,Spring WebSocket提供了更强大的功能和更方便的使用方式。

配置WebSocket支持

在Spring Boot项目中使用WebSocket,需要在pom.xml中引入spring-boot-starter-websocket,然后在配置类上添加@EnableWebSocket注解。以下是示例代码。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ChatWebSocketHandler(), "/websocket").setAllowedOrigins("*");
        registry.addHandler(new ChatSockJSHandler(), "/sockjs").setAllowedOrigins("*").withSockJS();
    }

}

WebSocketHandler

WebSocketHandler是处理WebSocket请求的核心接口,可以通过它完成WebSocket消息的处理和响应。以下是示例代码。

public class ChatWebSocketHandler extends TextWebSocketHandler {

    private static final List<WebSocketSession> SESSIONS = Collections.synchronizedList(new ArrayList<>());

    /**
     * 客户端建立连接
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        SESSIONS.add(session);
        String message = "欢迎 " + session.getAttributes().get("nickname") + " 进入聊天室!";
        broadcast(message);
    }

    /**
     * 收到客户端消息
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String info = session.getAttributes().get("nickname") + ":" + message.getPayload();
        broadcast(info);
    }

    /**
     * 客户端断开连接
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        SESSIONS.remove(session);
        String message = session.getAttributes().get("nickname") + "已离开聊天室!";
        broadcast(message);
    }

    /**
     * 广播消息给所有客户端
     */
    private void broadcast(String message) throws Exception {
        for (WebSocketSession session : SESSIONS) {
            session.sendMessage(new TextMessage(message));
        }
    }
}

SockJS支持

SockJS是一种WebSocket的备选方案,用于在不支持WebSocket的环境下使用WebSocket。Spring WebSocket提供了SockJS支持,只需要在WebSocketHandlerRegistrar中使用withSockJS()即可。以下是示例代码。

public class ChatSockJSHandler extends AbstractWebSocketHandler implements SockJsService {

    private static final List<WebSocketSession> SESSIONS = Collections.synchronizedList(new ArrayList<>());

    /**
     * 客户端建立连接
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        SESSIONS.add(session);
        String message = "欢迎 " + session.getAttributes().get("nickname") + " 进入聊天室!";
        broadcast(message);
    }

    /**
     * 收到客户端消息
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String info = session.getAttributes().get("nickname") + ":" + message.getPayload();
        broadcast(info);
    }

    /**
     * 客户端断开连接
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        SESSIONS.remove(session);
        String message = session.getAttributes().get("nickname") + "已离开聊天室!";
        broadcast(message);
    }

    /**
     * 广播消息给所有客户端
     */
    private void broadcast(String message) throws Exception {
        for (WebSocketSession session : SESSIONS) {
            session.sendMessage(new TextMessage(message));
        }
    }
}

以上是Java应用层协议WebSocket实现消息推送的详细攻略,同时提供了两种实现方式的示例代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java应用层协议WebSocket实现消息推送 - Python技术站

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

相关文章

  • 如何用jQuery删除一个HTML元素的所有属性

    使用jQuery可以轻松地删除一个HTML元素的所有属性。以下是详细的攻略,包含两个示例,演示如何使用jQuery删除一个HTML元素的所有属性: 步骤1:引入jQuery库 在使用之前,需要先在HTML文引入jQuery库。可以通过以下方式引入: <script src="https://code.jquery.com/jquery-3.6…

    jquery 2023年5月9日
    00
  • JQuery使用数组遍历跳出each循环

    当需要在JQuery的each循环中根据特定条件跳出循环时,我们可以使用数组来遍历,并在循环中使用“return false”语句来达到跳出循环的目的。下面是详细的攻略: 1. 创建需要遍历的数组 首先,我们需要创建一个需要遍历的数组,例如以下代码: var arr = [1, 2, 3, 4, 5]; 2. 遍历数组 接下来,我们需要使用JQuery的ea…

    jquery 2023年5月28日
    00
  • jQWidgets jqxGrid hiderowdetails() 方法

    jQWidgets jqxGrid hiderowdetails() 方法详解 jQWidgets jqxGrid 是一种表格控件,用于在 Web 应用程序中创建表格。hiderowdetails() 方法是 jqxGrid 控件的一个方法,用于隐藏表格中的行详情。本文将详细讲解 hiderowdetails() 方法的使用方法,并提供两个示例。 方法 hi…

    jquery 2023年5月10日
    00
  • 浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流

    浅谈事件冒泡 当一个元素上触发一个事件(比如鼠标点击),该事件会从该元素开始向上冒泡,直到传到文档的根节点。因此,如果父元素和子元素都定义了同一个事件处理程序,这个事件会先被触发在子元素上,然后再在父元素上触发。 <div id="parent"> <div id="child"></di…

    jquery 2023年5月27日
    00
  • jQWidgets jqxListBox ensureVisible()方法

    jQWidgets jqxListBox ensureVisible()方法攻略 jQWidgets 是一个基于 jQuery 的 UI 组件库,提供了丰富的 UI 组件和工具,可用于创建现代化 Web 应用程序。 jqx 是列表框组件提供了丰富的配置选项和方法。攻略将详细介绍 jqxListBox 的 ensureVisible() 方法,该方法用于确保列…

    jquery 2023年5月10日
    00
  • jQuery UI buttonset items选项

    jQuery UI buttonset items选项 jQuery UI buttonset是一个可定制的插件,它可以将一组单选按钮或复选框转换为按钮集。items选项是其中一个选项,它允许我们指定要转换为按钮集元素。在本文中,我们将详细介绍jQuery UI buttonset items选项的用法和示例。 items选项 items选项是 UI but…

    jquery 2023年5月11日
    00
  • jQWidgets jqxButton toggle()方法

    jQWidgets jqxButton toggle()方法详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件工具包。jqxButton是其中之一。本文将细介绍jqxButton的toggle()方法,包括定义、语法和示例。 toggle()方法的定义 jqxButton的toggle()方法用于切换按钮的状态。当按钮处于激活状态…

    jquery 2023年5月10日
    00
  • jQuery实现移动端扭蛋机抽奖

    这里我来详细讲解“jQuery实现移动端扭蛋机抽奖”的完整攻略。我们将通过步骤和示例说明这个过程。 步骤 1. 设计页面布局 首先,我们需要设计一个页面布局,用于展示扭蛋机和展示抽奖结果。这里我们可以使用HTML和CSS来完成。 2. 实现扭蛋机抽奖 通过jQuery,可以方便地实现扭蛋机抽奖的功能。这里我们需要实现以下步骤: 监听用户点击扭蛋机按钮的事件。…

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