当前位置: 首页 > article >正文

WebSocket介绍和入门案例

目录

  • 一、WebSocket 详解
    • 1. 定义与特点:
    • 2. 工作原理:
    • 3. 应用场景:
  • 二、入门案例

一、WebSocket 详解

1. 定义与特点:

  • WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时、双向的数据传输,克服了传统 HTTP 协议只能由客户端发起请求、服务器响应的单向通信模式的局限性。
  • 特点包括低延迟、实时性强、减少不必要的网络流量和服务器资源消耗等。
  • HTTP协议和WebSocket协议对比:
  • HTTP是短连接
  • WebSocket是长连接
  • HTTP通信是单向的,基于请求响应模式(浏览器发送请求给服务器)
  • WebSocket支持双向通信
  • HTTP和WebSocket底层都是TCP连接

2. 工作原理:

  • 建立连接:客户端向服务器发起 WebSocket 连接请求,该请求通过 HTTP 协议进行握手。如果服务器支持 WebSocket,它会返回一个特殊的 HTTP 响应,通知客户端可以将连接升级为 WebSocket 连接。
  • 数据传输:一旦连接建立,客户端和服务器可以随时双向发送数据。数据以帧的形式进行传输,可以是文本数据或二进制数据。
  • 连接关闭:任何一方都可以发送关闭连接的请求,关闭连接后双方不能再进行数据传输。

**思考**:既然WebSocket支持双向通信,功能看似比HTTP强大,那么我们是不是可以基于WebSocket开发所有的业务功能?

WebSocket缺点

  • 服务器长期维护长连接需要一定的成本
  • 各个浏览器支持程度不一
  • WebSocket 是长连接,受网络限制比较大,需要处理好重连

结论:WebSocket并不能完全取代HTTP,它只适合在特定的场景下使用

3. 应用场景:

  • 实时聊天应用:实现用户之间的即时通信,消息实时推送。
  • 在线游戏:同步游戏状态,实时交互。
  • 金融交易平台:实时显示股票价格、交易数据等。
  • 监控系统:实时反馈系统状态、设备运行数据等。
  • 弹幕的实现

二、入门案例

以下是一个使用 Java 和 Spring Boot 实现的简单 WebSocket 入门案例:

  1. 创建一个 Spring Boot 项目,并在项目的依赖管理文件(如 pom.xml)中添加 Spring Boot WebSocket 的依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. 配置 WebSocket:

创建一个配置类,用于配置 WebSocket 端点:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(sampleWebSocketHandler(), "/ws").setAllowedOrigins("*");
    }

    @Bean
    public SampleWebSocketHandler sampleWebSocketHandler() {
        return new SampleWebSocketHandler();
    }
}
  1. 创建 WebSocket 处理类:
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Component
public class SampleWebSocketHandler extends TextWebSocketHandler {

    private List<WebSocketSession> sessions = new ArrayList<>();

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
        // 当接收到客户端消息时,可以进行处理并向所有连接的客户端广播
        String payload = message.getPayload();
        for (WebSocketSession s : sessions) {
            s.sendMessage(message);
        }
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        // 当连接建立时,将 session 添加到列表中
        sessions.add(session);
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        // 当连接关闭时,从列表中移除 session
        sessions.remove(session);
    }
}
  1. 在前端页面中使用 WebSocket:
<!DOCTYPE html>
<html>

<head>
    <script>
        var socket = new WebSocket("ws://localhost:8080/ws");
        socket.onmessage = function (event) {
            console.log(event.data);
        };
        function sendMessage() {
            var message = document.getElementById("messageInput").value;
            socket.send(message);
        }
    </script>
</head>

<body>
    <input type="text" id="messageInput">
    <button onclick="sendMessage()">发送消息</button>
</body>

</html>

http://www.kler.cn/news/354759.html

相关文章:

  • xavier 在tensorflow pytorch中的应用,正太分布和均匀分布的计算公式不一样
  • 串的模式匹配算法_BF算法
  • 【实战案例】SpringBoot项目中异常处理通用解决方案
  • 单片机原理与应用——嵌入式系统中的核心控制器
  • MySQL从入门到跑路
  • 干货|antd组件库Table组件开启虚拟列表的影响
  • 深度解析RLS(Recursive Least Squares)算法
  • 【Spring篇】初识之Spring的入门程序及控制反转与依赖注入
  • 如何利用被动DNS(Passive DNS)加强网络安全
  • STM32学习笔记---RTC
  • 中级注册安全工程师《安全生产法律法规》真题及详解
  • 48 | 代理模式:代理在RPC、缓存、监控等场景中的应用
  • 分布式管理工具分析:Java、Go 和 Python
  • 【vue】keep-alive动态组件的基础用法
  • 【text2sql】基于上下文文学习的MCS-SQL框架在Spider和BIRD取得了新SOTA
  • 线性可分支持向量机的原理推导
  • Android Jetpack组件库中的LiveData和ViewModel的作用。
  • 探索OpenCV的人脸检测:用Haar特征分类器识别图片中的人脸
  • [含文档+PPT+源码等]精品基于springboot实现的原生微信小程序汽车保养服务
  • 绿幕虚拟直播五大“硬件环境”