WebSocket学习笔记

概述

WebSocket是一种网络通信协议,它在2011年被IETF(互联网工程任务组)标准化为RFC 6455。WebSocket协议允许服务器与客户端之间进行全双工通信,即客户端和服务器可以在任何时候发送消息,而不需要像传统的HTTP请求那样等待响应。
WebSocket的主要特点包括:

  1. 全双工通信:客户端和服务器可以在任何时候发送消息,实现了真正的实时通信。
  2. 基于TCP协议:WebSocket在传输层使用TCP协议,保证了数据的可靠传输。
  3. 握手过程:WebSocket连接的建立是通过HTTP协议的升级请求来完成的。客户端发起一个普通的HTTP请求,并在请求头中包含升级到WebSocket的请求。如果服务器支持WebSocket,它会同意升级,并返回一个101 Switching Protocols的响应,之后连接就会使用WebSocket协议。
  4. 轻量级:WebSocket消息格式相对简单,减少了数据传输的开销。
  5. 跨域支持:WebSocket协议支持跨源通信,允许不同域的网页应用进行数据交换。
  6. 持久连接:一旦WebSocket连接建立,它就会保持开放状态,直到客户端或服务器显式地关闭连接。
    WebSocket的应用场景包括但不限于:
  • 实时消息传递:如即时通讯、聊天室等。
  • 实时游戏:多人在线游戏、实时对战游戏等。
  • 实时数据流:如实时股票报价、实时监控系统等。
  • 实时协作工具:如在线白板、文档协作编辑等。
    在现代Web应用中,WebSocket已经成为实现实时互动功能的重要技术之一。随着HTML5的普及,WebSocket得到了广泛的支持,几乎所有的现代浏览器都支持WebSocket协议。

websocket应用示例

这里计划使用FastAPI实现一个WebSocket服务并创建一个Python客户端来接收消息。
安装依赖:

pip install fastapi[all] websockets

服务端程序

from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse
from typing import List

app = FastAPI()

html = """
<!DOCTYPE html>
<html>
    <head>
        <title>WebSocket Example</title>
    </head>
    <body>
        <script>
            var ws = new WebSocket("ws://localhost:8000/ws");
            ws.onmessage = function(event) {
                var messages = document.getElementById('messages')
                var message = document.createElement('li')
                message.appendChild(document.createTextNode(event.data))
                messages.appendChild(message)
            };
            function sendMessage() {
                var input = document.getElementById('messageInput');
                ws.send(input.value);
                input.value = '';
            }
        </script>
        <input type="text" id="messageInput" placeholder="Type a message...">
        <button οnclick="sendMessage()">Send</button>
        <ul id="messages"></ul>
    </body>
</html>
"""

active_connections: List[WebSocket] = []

@app.get("/")
async def get():
    return HTMLResponse(html)

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    active_connections.append(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            for conn in active_connections:
                if conn == websocket:
                    continue
                await conn.send_text(f"User: {data}")
    except WebSocketDisconnect:
        active_connections.remove(websocket)

客户端程序

import asyncio
import websockets

async def hello():
    uri = "ws://localhost:8000/ws"
    async with websockets.connect(uri) as websocket:
        while True:
            response = await websocket.recv()
            print(f"Received message from server: {response}")

asyncio.get_event_loop().run_until_complete(hello())

运行服务器和客户端
运行FastAPI WebSocket服务:

uvicorn websocket_server:app --reload

在另一个终端窗口中运行Python WebSocket客户端:

python websocket_client.py

客户端现在应该会持续运行,等待并打印出从服务器接收到的消息。如果你打开浏览器并访问http://localhost:8000,你可以在HTML页面中输入消息,这些消息会被服务器广播给所有连接的客户端,包括Python客户端。

WebSocket有哪些常见的安全问题

WebSocket协议虽然为实时通信带来了便利,但也带来了一些安全挑战。以下是一些常见的WebSocket安全问题:

  1. 跨站请求伪造(CSRF):由于WebSocket连接可以在不同域之间建立,攻击者可能会利用WebSocket接口进行CSRF攻击,强迫用户的浏览器在已登录的WebSocket会话中执行非用户意愿的操作。
  2. 跨站脚本包含(XSSI):如果WebSocket服务器返回的数据没有适当的保护措施,攻击者可能会通过XSSI攻击窃取敏感数据。
  3. 数据泄露:WebSocket连接可能会传输敏感数据,如果数据没有加密,或者加密措施不当,攻击者可能会通过中间人攻击(MITM)窃取数据。
  4. 拒绝服务攻击(DoS):由于WebSocket连接是持久的,攻击者可以通过建立大量连接来消耗服务器资源,导致合法用户无法访问服务。
  5. 权限控制不当:如果WebSocket服务器没有正确实施权限控制,攻击者可能会访问或篡改其他用户的会话。
  6. 心跳机制缺失或无效:WebSocket连接可能因为网络问题、服务器问题或客户端问题而断开。如果没有适当的心跳机制来检测连接状态,可能会导致资源泄漏或服务中断。
  7. 协议降级攻击:攻击者可能会尝试将WebSocket连接降级到不安全的HTTP协议,从而进行中间人攻击。
  8. 错误的消息验证:如果服务器没有正确验证客户端发送的消息,可能会导致注入攻击,例如SQL注入、XML注入等。
    为了防范这些安全问题,可以采取以下措施:
  • 使用wss://(WebSocket Secure)代替ws://,确保WebSocket连接使用SSL/TLS加密。
  • 实施适当的认证和授权机制,确保只有合法用户才能访问WebSocket服务。
  • 使用反向代理或API网关来管理WebSocket连接,以便实施更细粒度的安全策略。
  • 对WebSocket消息进行适当的验证和清理,防止注入攻击。
  • 实现心跳机制来监控连接状态,及时释放断开的连接资源。
  • 限制连接数量和消息速率,防止DoS攻击。
  • 对WebSocket服务进行渗透测试和代码审计,及时发现和修复安全漏洞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/591387.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开发技巧 | 第二篇】IDEA新增作者信息、方法参数返回值

文章目录 2.IDEA新增作者信息、方法参数返回值2.1类新增作者信息2.2方法新增参数返回信息2.3测试2.3.1新建类2.3.2新建方法 2.IDEA新增作者信息、方法参数返回值 2.1类新增作者信息 打开IDEA的Settings&#xff0c;Editor->Code Style->File and Code Templates->Inc…

使用 ORPO 微调 Llama 3

原文地址&#xff1a;https://towardsdatascience.com/fine-tune-llama-3-with-orpo-56cfab2f9ada 更便宜、更快的统一微调技术 2024 年 4 月 19 日 ORPO 是一种新的令人兴奋的微调技术&#xff0c;它将传统的监督微调和偏好校准阶段合并为一个过程。这减少了训练所需的计算…

思科防火墙查如何查看现有ipsec隧道信息

环境&#xff1a; 思科ASA5555 问题描述&#xff1a; 思科防火墙查如何看现有ipsec隧道信息 解决方案&#xff1a; 1.进入特权模式&#xff1a; enable 查看isakmp信息 show crypto isakmp sa2.查看ipsec信息 show crypto ipsec sa上述命令将显示当前的ISAKMP安全关联…

设计模式之组合实体模式

在编程的奇幻森林里&#xff0c;树木与枝叶错综复杂&#xff0c;如何让代码世界井然有序&#xff1f;组合实体模式&#xff08;Composite Pattern&#xff09;就像一位高明的园艺师&#xff0c;它以一种巧妙的方式&#xff0c;将个体与整体统一管理&#xff0c;让无论是单个对象…

【Conda】解决使用清华源创建虚拟环境不成功问题

文章目录 问题描述&#xff1a;清华源创建不成功解决步骤1 添加官方源步骤2 删除C:/user/你的用户名/的 .condarc 文件步骤3 再次创建 问题描述&#xff1a;清华源创建不成功 本地配置了清华源&#xff0c;但是在创建虚拟环境时不成功&#xff0c;报错如下。 图片若看不清&…

直流屏电源模块HK22010/T2充电模块HK11010/T2说明

直流屏整流模块HK22010/T2电源模块HK11010/T2充电机HK22005/T2&#xff0c;HK11020/T2&#xff0c;HK22020/T2以及各种电源型号介绍 产品名称&#xff1a;直流屏电源模块HK22005/T2充电机HK11020/T2整流模块HK11005/T2&#xff0c;HK22020/T2 技术参数 交流输入额定电压&…

AI大模型探索之路-训练篇11:大语言模型Transformer库-Model组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

一觉醒来 AI科技圈发生的大小事儿 05月03日

&#x1f4f3;马斯克刚回美国&#xff0c;旋风裁掉了这个部门 特斯拉CEO马斯克裁撤超充团队&#xff0c;开除两名高管&#xff0c;转向AI领域&#xff0c;集中精力发展FSD&#xff1b;裁员举措引发合作伙伴担忧&#xff0c;特斯拉放缓充电站建设&#xff0c;影响整个行业&…

./build.sh:行1: g++: 未找到命令的错误问题在centos操作系统下面如何解决

目录 g: 未找到命令报错解释g: 未找到命令解决方法 centos操作系统&#xff0c;执行一个bash&#xff0c;bash命令很简单&#xff0c;就是用g编译一个C的程序。报告错误&#xff1a; ./build.sh:行1: g: 未找到命令 g: 未找到命令报错解释 这个错误表明在执行名为 build.sh 的…

一文了解复杂度

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、算法效率二、时间复杂度1.定义2.大O的渐进表示法3.一般常见复杂度4.实例 三、空间复杂度1.定义2.空间复杂度计算3.实例 总结 前言 计算复杂性理论&#xf…

LWIP+TCP客户端

一、TCP API函数 其中tcp_poll()函数的第三个参数表示隔几秒调用一次这个周期性函数 二、修改服务器的IP 三、TCP客户端编程思路 申请套接字绑定服务器IP和端口号等待客户端连接 进入连接回调函数在连接回调函数中 配置一些回调函数&#xff0c;如接收回调函数&#xff0c;周期…

FIFO Generate IP核使用——AXI接口FIFO简介

AXI接口FIFO是从Native接口FIFO派生而来的。AXI内存映射接口提供了三种样式&#xff1a;AXI4、AXI3和AXI4-Lite。除了Native接口FIFO支持的应用外&#xff0c;AXI FIFO还可以用于AXI系统总线和点对点高速应用。 AXI接口FIFO不支持Builtin FIFO和 Shift Register FIFO配置。 当…

UG NX二次开发(C#)-获取Part中对象创建时的序号(*)

文章目录 1、前言2、UG NX的对象序号讲解3、采用UG NX二次开发或者建模序号4、注意事项1、前言 在UG NX中,我们创建任意一个对象,都会在模型历史中添加一个创建对象的编号,即是对象序号,这个是递增的,当删除中间产生的对象时,其序号会重新按照建模顺序重新排布。今天一个…

34.基础乐理-简谱需要移调吗?

首先需要具备 首调 与 固定调的知识&#xff0c;才能理解&#xff0c;以两只老虎为例子&#xff0c;如下图&#xff1a; 首调&#xff1a;可以看到C大调、D大调、E大调三种方式的乐谱&#xff0c;记录的数字&#xff0c;记录的唱名&#xff0c;都是1231&#xff0c;唯一不同的…

Zookeeper服务

一、什么是Zookeeper Zookeeper 是一个分布式应用程序的协调服务&#xff0c;它提供了一个高性能的分布式配置管理、分布式锁服务和分布式协调服务。它是 Apache 软件基金会的一个项目&#xff0c;被设计用来处理大规模的分布式系统中的一些关键问题。 Zookeeper的组成员关系&…

论文辅助笔记:Tempo 之 model.py

0 导入库 import math from dataclasses import dataclass, asdictimport torch import torch.nn as nnfrom src.modules.transformer import Block from src.modules.prompt import Prompt from src.modules.utils import (FlattenHead,PoolingHead,RevIN, )1TEMPOConfig 1.…

在编程的世界里,我相信每一行代码都是一次对未来的投资

&#x1f600;前言 突然有感而发也是激励自己互勉 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 在编程的世界里&#xff0c;我相信每一行代码都是一次对未来的投资类似句子编程的本质代码的价值构建可持续的未来结语 在编程的世界里&#xff0c;我相信每一行代码都是一…

【JVM】GC调优(优化JVM参数)、性能调优

GC调优 GC调优的主要目标是避免由垃圾回收引起程序性能下降。 GC调优的核心指标 垃圾回收吞吐量&#xff1a;执行用户代码时间/&#xff08;执行用户代码时间 GC时间&#xff09;延迟&#xff1a;GC延迟 业务执行时间内存使用量 GC调优步骤 发现问题&#xff1a;通过监控…

Servlet详解(从xml到注解)

文章目录 概述介绍作用 快速入门Servelt的执行原理执行流程&#xff1a;执行原理 生命周期概述API 服务器启动&#xff0c;立刻加载Servlet对象(理解)实现Servlet方式(三种)实现Servlet接口实现GenericServlet抽象类&#xff0c;只重写service方法实现HttpServlet实现类实现Htt…

python:用 mido 生成 midi文件,用 pygame 播放 mid文件

pip install mido Downloading mido-1.3.2-py3-none-any.whl (54 kB) Downloading packaging-23.2-py3-none-any.whl (53 kB) Installing collected packages: packaging, mido Successfully installed mido-1.3.2 packaging-23.2 mido 官网文档 pip intall pygame pygame…
最新文章