spring WebSocket示例详解

下面我将详细讲解“spring WebSocket示例详解”的完整攻略。

简介

本文将详细介绍如何在 Spring 框架下使用 WebSocket。WebSocket 是一种实时通信协议,能够从客户端向服务器端推送消息,而服务器端能够主动向客户端推送消息。相比于传统的 HTTP 请求方式,WebSocket 具有实时性更强、资源占用更少等优点。

本文使用 Spring Boot 2.x,同时也会使用到 Spring Framework 中的 Spring WebSocket。

环境准备

要运行本文的示例代码,需要具备以下环境:

  • JDK 1.8 或以上;
  • Maven 3.2 或以上;
  • Idea 或 Eclipse 等 IDE。

项目搭建

首先,我们需要搭建一个 Spring Boot 的基础项目。可以使用 Spring Initializr 快速创建一个基础的 Spring Boot 项目。

然后,我们需要添加 Spring WebSocket 的依赖。在 pom.xml 中添加以下代码:

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

示例一:简单示例

本示例演示了如何在 Spring Boot 应用中实现 WebSocket 的基本功能。

  1. 创建一个 WebSocketConfig 类,配置消息代理和消息端点:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket-demo").withSockJS();
    }
}
  1. 创建一个控制器来处理 WebSocket 相关的请求:
@Controller
public class WebSocketController {

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) {
        return new Greeting("Hello, " + message.getName() + "!");
    }
}
  1. 创建一个 HelloMessage 类和一个 Greeting 类,用于传递消息:
public class HelloMessage {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class Greeting {

    private String content;

    public Greeting(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }
}
  1. 最后,我们需要创建一个前端页面来测试 WebSocket。以下是一个基本的 HTML 页面:
<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Demo</title>
    <script src="/webjars/sockjs-client/1.0.2/sockjs.min.js"></script>
    <script src="/webjars/stomp-websocket/2.3.3/stomp.min.js"></script>
    <script src="/js/app.js"></script>
</head>
<body>

<div>
    <label for="name">Name:</label> <input type="text" id="name">
    <button id="connect">Connect</button>
    <button id="disconnect">Disconnect</button>
</div>

<div id="greetings">
</div>

</body>
</html>

app.js 的代码如下:

var stompClient = null;

function connect() {
    var socket = new SockJS('/websocket-demo');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function (greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

function disconnect() {
    if (stompClient !== null) {
        stompClient.disconnect();
    }
    setConnected(false);
    console.log("Disconnected");
}

function sendName() {
    stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
}

function showGreeting(message) {
    $("#greetings").append("<tr><td>" + message + "</td></tr>");
}

function setConnected(connected) {
    $("#connect").prop("disabled", connected);
    $("#disconnect").prop("disabled", !connected);
    if (connected) {
        $("#greetings").show();
    }
    else {
        $("#greetings").hide();
    }
}

$(function () {
    $("form").on('submit', function (e) {
        e.preventDefault();
    });
    $("#connect").click(function () {
        connect();
    });
    $("#disconnect").click(function () {
        disconnect();
    });
    $("#send").click(function () {
        sendName();
    });
});

运行项目,访问 http://localhost:8080/index.html,测试 WebSocket 是否可用。

示例二:群聊示例

本示例演示了如何在 Spring Boot 应用中实现 WebSocket 群聊的功能。

  1. 创建一个 ChatRoom 类,该类保存了 WebSocket 会话的管理器和一个群聊列表:
@Component
public class ChatRoom {

    private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();

    private final List<String> messages = new CopyOnWriteArrayList<>();

    public void addSession(WebSocketSession session) {
        sessions.put(session.getId(), session);
    }

    public void removeSession(WebSocketSession session) {
        sessions.remove(session.getId());
    }

    public List<String> getMessages() {
        return messages;
    }

    public void addMessage(String message) {
        messages.add(message);
        if (messages.size() > 100) {
            messages.remove(0);
        }
    }

    public void broadcast(String message) {
        TextMessage textMessage = new TextMessage(message);
        sessions.values().forEach(session -> {
            try {
                session.sendMessage(textMessage);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
}
  1. 创建一个 WebSocketHandler 类,用于处理 WebSocket 相关的请求:
@Component
public class WebSocketHandler extends TextWebSocketHandler {

    private final ObjectMapper objectMapper = new ObjectMapper();

    @Autowired
    private ChatRoom chatRoom;

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        ChatMessage chatMessage = objectMapper.readValue(message.getPayload(), ChatMessage.class);
        chatRoom.addMessage(chatMessage.getFrom() + ": " + chatMessage.getMessage());
        chatRoom.broadcast(chatMessage.getFrom() + ": " + chatMessage.getMessage());
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        chatRoom.addSession(session);
        for (String message : chatRoom.getMessages()) {
            session.sendMessage(new TextMessage(message));
        }
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        chatRoom.removeSession(session);
    }
}
  1. 创建一个 ChatMessage 类,用于传递消息:
public class ChatMessage {

    private String from;

    private String message;

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
  1. 创建一个控制器,用于处理页面请求:
@Controller
public class PageController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }
}
  1. 创建一个前端页面来测试 WebSocket。以下是一个基本的 HTML 页面:
<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Chat Demo</title>
</head>
<body>

<form onsubmit="return false;">
    Name: <input type="text" id="name" value="User1"><br>
    Message: <input type="text" id="message"><br>
    <button onclick="sendMessage()">Send</button>
</form>

<hr>

<div id="chat">
</div>

<script type="text/javascript">
    var ws;

    document.addEventListener("DOMContentLoaded", function(event) {
        ws = new WebSocket("ws://" + document.location.host + "/ws");
        ws.onmessage = showMessage;
        ws.onclose = console.warn;
    });

    function showMessage(event) {
        var data = JSON.parse(event.data);
        var chat = document.getElementById("chat");
        var message = document.createElement("p");
        message.innerText = data;
        chat.append(message);
    }

    function sendMessage() {
        var name = document.getElementById("name").value;
        var message = document.getElementById("message").value;
        var chatMessage = {from: name, message: message};
        ws.send(JSON.stringify(chatMessage));
        document.getElementById("message").value = "";
    }
</script>

</body>
</html>

以上就是使用 Spring WebSocket 的基本流程,如有问题请随时提问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring WebSocket示例详解 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • js是什么文件格式?.js文件怎么打开?

    JS是JavaScript的缩写,是一种脚本语言,广泛用于Web页面的设计,行为与HTML相互作用,并且可以被各种不同的网页浏览器支持。 对于.js文件,它是JavaScript代码文件的文件扩展名,在开发过程中非常常见。通常,我们需要打开.js文件来编辑、查看或修改其中的代码内容。下面是打开.js文件的几种方法: 方法一:使用文本编辑器 我们可以通过文本编…

    JavaScript 2023年5月27日
    00
  • Javascript立即执行函数(IIFE)实例详解

    Javascript立即执行函数(IIFE)实例详解 在Javascript中,立即执行函数指的是定义完函数后立即自动调用该函数,避免了函数命名污染全局变量的问题,同时可以更好地保护函数内部的变量隐私和封装性。下面就是关于Javascript立即执行函数的详细攻略。 什么是Javascript立即执行函数 Javascript立即执行函数的定义格式如下: (…

    JavaScript 2023年5月27日
    00
  • hta编写的软件管理工具0.1(IE7.0测试通过)

    很高兴为您讲解 “hta编写的软件管理工具0.1(IE7.0测试通过)” 的完整攻略。以下是详细说明: 概述 这个工具是用HTML Application (HTA) 技术编写的,旨在用于软件安装、升级、卸载和软件信息查看等功能。它可以通过IE浏览器来运行,支持版本为IE7及以上。该工具还使用了VBScript编写的代码实现一些功能。 环境要求 在您使用该工…

    JavaScript 2023年6月11日
    00
  • tree shaking对打包体积优化及作用

    什么是Tree Shaking Tree Shaking 是指在打包过程中,检测出未被引用的代码,并在最终打包结果中将这些未引用的代码(也被称为“未引用代码(dead code)”)移除。Tree Shaking 目的是为了精简打包后的代码和减小文件体积,提升网页加载速度。 在理解 Tree Shaking 之前需要了解几个概念:- 模块 (Module):…

    JavaScript 2023年6月11日
    00
  • JavaScript Math.round() 方法

    当我们需要对一个数进行四舍五入操作时,可以使用 JavaScript 的 Math.round() 方法。该方法接收一个数字参数,并将它四舍五入为一个整数。 使用语法: Math.round(x) 其中x是一个数字参数,表示要进行四舍五入操作的数字。 下面我们来看两个示例: 示例1: var num1 = 3.14; var num2 = 6.75; con…

    JavaScript 2023年5月27日
    00
  • JS数组reduce你不得不知道的25个高级用法

    下面我来为你详细讲解“JS数组reduce你不得不知道的25个高级用法”的完整攻略。 1. 什么是reduce? reduce() 方法用于对数组中的所有元素依次执行指定的回调函数,并将其缩减为单个值。这个值就是最后的返回值。reduce() 方法可以接收两个参数:回调函数和初始值。 一个简单的示例如下: let arr = [1, 2, 3, 4, 5];…

    JavaScript 2023年5月27日
    00
  • Javascript读取cookie函数代码

    下面我为您讲解如何编写Javascript读取cookie函数代码的完整攻略。 第一步:创建函数 首先,我们需要创建一个读取cookie值的函数。可以按照以下方法编写: function getCookie(name) { var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(…

    JavaScript 2023年6月11日
    00
  • 35个JS中实用工具函数的代码分享

    标题:35个JS中实用工具函数的代码分享 介绍 本文将分享35个JS中实用工具函数的代码。这些函数可以被应用于日常开发中,提高开发和编码效率。在下面的内容中,每个函数均附带代码示例,帮助读者更好地理解和应用它们。 代码分享 函数 1:isArray 判断变量是否为数组。 function isArray (arr) { return Object.proto…

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