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验证电话号码与手机支持+86的正则表达式

    要验证电话号码与手机是否支持+86,我们需要使用正则表达式。 以下是一个通用的正则表达式,用于检查电话号码或手机号是否正确: /^((0\d{2,3}-\d{7,8})|(1[34578]\d{9}))$/ 让我们详细分析这个正则表达式: ^表示字符串开头。 (表示一个捕获分组的开始。 0\d{2,3}-\d{7,8}匹配固定电话号码,其中0后面是2或3个数…

    JavaScript 2023年6月10日
    00
  • javascript实现弹出层效果

    实现弹出层效果通常使用javascript的模态框(Modal)实现。以下是步骤: 步骤一:构建HTML结构 为弹出层准备一个HTML结构,该结构包括带有唯一标识符的背景层和弹出层本身。如下所示: <div id="overlay"> <div id="popup"> <h2>这是弹…

    JavaScript 2023年6月11日
    00
  • JS设置获取cookies的方法

    当我们需要在网站或应用程序中储存数据时,Cookies 是一种常见的解决方案。通过在浏览器中创建 Cookies,我们可以方便地存储用户信息、在线购物车、偏好设置等等内容。在 JavaScript 中,设置和获取 Cookies 非常简单,下面是介绍如何设置和获取 Cookies 的攻略: 设置 Cookies 使用 JavaScript 设置 Cookie…

    JavaScript 2023年6月11日
    00
  • Javascript 面向对象 对象(Object)

    下面是 Javascript 面向对象 对象(Object)的完整攻略: 理解概念 JavaScript 的面向对象和其他语言很相似,都是基于类和实例的概念。但是 JavaScript 中没有类,而是通过对象来实现面向对象编程。 对象可以看作是一个属性的集合,每个属性都是由键值对(key-value pair)组成,键名是字符串,键值可以是任意的 JavaS…

    JavaScript 2023年5月27日
    00
  • javascript中bind函数的作用实例介绍

    JavaScript中bind函数的作用实例介绍 在 JavaScript 中,可以使用 bind() 方法来将一个函数绑定到一个特定的上下文,从而返回一个新的函数,该函数中 this 关键字被绑定到指定的对象上。bind() 方法有很多用途,例如: 将方法绑定到对象上 创建有默认参数的函数 创建函数的柯里化版本 实现延迟执行函数 方法绑定示例 方法绑定是使…

    JavaScript 2023年6月11日
    00
  • js日历功能对象

    关于JS日历功能对象的详细讲解,请看下面的攻略。 什么是JS日历功能对象 JS日历功能对象是一个封装了日历相关功能的JavaScript对象,其中包括了生成日历的HTML、获取当前日期、切换月份、选择日期、设置默认日期等功能,极大地方便了Web页面中使用日历的开发。 JS日历功能对象的基本使用方法 以下将以一个名为calendar的日历对象为例,详细讲解JS…

    JavaScript 2023年6月10日
    00
  • JavaScript中把数字转换为字符串的程序代码

    将数字转换为字符串在 JavaScript 中是一个非常常见的操作。下面是一些示例代码可以帮助你将数字转换为字符串: 方法一: toString() 使用 toString() 方法是最常见的将数字转换为字符串的方法。它的基本语法如下: num.toString([base]); 其中,num 是要转换的数字,base 是可选的参数,表示要使用的进制。如果没…

    JavaScript 2023年5月28日
    00
  • javascript实现的多个层切换效果通用函数实例

    接下来我会详细讲解“javascript实现的多个层切换效果通用函数实例”的完整攻略,包括实现思路、代码实现和示例说明。 实现思路 本例中,我们使用 JavaScript 实现多个层(div)之间的切换效果。我们将所有的层使用 CSS 定位,每次切换时修改对应的层的 z-index 属性为最高,其他层的 z-index 属性为较低。同时,也需要使用 Java…

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