WebSocket 入门实战

1. 引言

WebSocket 是一种在单个 TCP 连接上提供全双工通信的协议,允许客户端和服务器之间实时、双向地进行数据交换。WebSocket 的引入使得 Web 应用程序能够更轻松地实现实时通信,如在线聊天、实时数据更新等。本文将介绍 WebSocket 的使用场景以及通过 Java 进行 WebSocket 编程的实例。

2. WebSocket 使用场景

WebSocket 在以下场景中非常有用:

  1. 实时聊天应用程序: WebSocket 提供了一种实时通信的方式,使得在线聊天应用程序能够实时地传递消息。

  2. 实时数据更新: 对于需要在客户端和服务器之间共享实时数据的应用程序,例如股票市场行情、在线游戏状态等。

  3. 协作应用程序: 在协作工具中,用户可以实时共享文档、图像等内容。

  4. 实时提醒和通知: 通过 WebSocket,服务器可以即时地向客户端推送通知,而不需要客户端不断地轮询。

3. Java代码示例

下面通过一个简单的 Java 示例来演示如何使用 Spring Boot 和 Spring WebSocket 来创建一个基本的 WebSocket 服务。

1. 创建 Spring Boot 项目

引入websocket-starter

XML 复制代码
 <!-- Spring Boot Starter WebSocket -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>

2. 编写 WebSocket 配置

创建一个 WebSocket 配置类,用于配置和启用 WebSocket:

java 复制代码
// WebSocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

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

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket-example").withSockJS();
    }
}

这个配置类配置了基本的消息代理,使得消息可以在客户端和服务器之间进行传递。

3. 创建 WebSocket 控制器

创建一个简单的 WebSocket 控制器,用于处理 WebSocket 消息:

java 复制代码
// WebSocketController.java
@Controller
public class WebSocketController {

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // 模拟处理时间
        return new Greeting("Hello, " + message.getName() + "!");
    }
}

4. 创建消息模型

创建用于传递消息的模型类:

java 复制代码
// HelloMessage.java
public class HelloMessage {

    private String name;

    // Getter and Setter
}


// Greeting.java
public class Greeting {

    private String content;

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

    // Getter
}

5. 编写前端页面

在前端页面使用 JavaScript 来处理 WebSocket 连接,创建一个test.html,写入以下代码

html 复制代码
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Example</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdn.jsdelivr.net/sockjs/1/sockjs.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>

</head>
<body>
    <div>
        <label for="name">Enter your name: </label>
        <input type="text" id="name" />
        <button onclick="connect()" id='connect'>Connect</button>
        <hr />
        <textarea id="messages" cols="40" rows="10" readonly></textarea>
        <hr />
        <label for="message">Message: </label>
        <input type="text" id="message" />
        <button onclick="sendMessage()">Send</button>
    </div>

    <script>
        var stompClient = null;

        function setConnected(connected) {
            document.getElementById('connect').disabled = connected;
        }

        function connect() {
            // 注意端口号
            var socket = new SockJS('http://localhost:8090/websocket-example');
            stompClient = Stomp.over(socket);
            stompClient.connect({}, function (frame) {
                setConnected(true);
			
                stompClient.subscribe('/topic/greetings', function (greeting) {
					console.log("receive websocket server msg:",greeting)
                    showGreeting(JSON.parse(greeting.body).content);
                });
            });
        }

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

        function sendMessage() {
            var message = document.getElementById('message').value;
            stompClient.send("/app/hello", {}, JSON.stringify({ 'name': message }));
        }

        function showGreeting(message) {
            var textarea = document.getElementById('messages');
            textarea.value += message + '\n';
        }
    </script>
</body>
</html>

注意,如果是直接打开上面的html页面,调用后端服务会存在跨域问题,需要用配置了跨域的谷歌浏览器打开才能使用。

6. 运行应用程序

运行 Spring Boot 应用程序,并访问

4. 总结

这个简单示例演示了如何使用 Spring Boot 和 Spring WebSocket 创建一个基本的 WebSocket 服务。通过这个例子,可以了解 WebSocket 在实时通信中的应用,如果大家在平时工作当中有遇到需要实时推送的场景,比如大屏实时展示数据变化,就可以用这种发放时。

相关推荐
EasyDSS38 分钟前
国标GB28181-2022平台EasyGBS:安防监控中P2P的穿透方法
网络协议·php·音视频·p2p
网安墨雨1 小时前
常用网络协议
网络·网络协议
ZoeLandia3 小时前
WebSocket | 背景 概念 原理 使用 优缺点及适用场景
网络·websocket·网络协议
Crossoads7 小时前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
诸葛悠闲7 小时前
SOME/IP 协议详解——信息格式
网络协议
_oP_i11 小时前
HTTP 请求Media typetext/plain application/json text/json区别
网络协议·http·json
OkeyProxy12 小时前
HTTP、HTTPS和SOCKS5代理協議
网络协议·https·云计算·代理服务器·海外ip代理
zquwei12 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
群联云防护小杜13 小时前
如何给负载均衡平台做好安全防御
运维·服务器·网络·网络协议·安全·负载均衡
ihengshuai13 小时前
HTTP协议及安全防范
网络协议·安全·http