Websocket

简介: Websocket

本篇文章我们聊一下Websocket这个话题 这是学习计算机的人们常常聊起的一个话题。

前言

WebSocket的出现,使得浏览器具备了实时双向通信的能力。本文由浅入深,介绍了WebSocket如何建立连接、交换数据的细节,以及数据帧的格式。此外,还简要介绍了针对WebSocket的安全攻击,以及协议是如何抵御类似攻击的。

2.什么是websocket?

HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。

对大部分web开发者来说,上面这段描述有点枯燥,其实只要记住几点:

  1. WebSocket可以在浏览器里使用
  2. 支持双向通信
  3. 使用很简单
  4. 基于TCP/IP协议

优点:

  1. 支持双向通信,实时性更强。
  2. 更好的二进制支持。
  3. 较少的控制开销。连接创建后,ws客户端、服务端进行数据交换时,协议控制的数据包头部较小。在不包含头部的情况下,服务端到客户端的包头只有2~10字节(取决于数据包长度),客户端到服务端的的话,需要加上额外的4字节的掩码。而HTTP协议每次通信都需要携带完整的头部。
  4. 支持扩展。ws协议定义了扩展,用户可以扩展协议,或者实现自定义的子协议。(比如支持自定义压缩算法等)

对网络应用层协议的学习来说,最重要的往往就是连接建立过程、数据交换教程。当然,数据的格式是逃不掉的,因为它直接决定了协议本身的能力。好的数据格式能让协议更高效、扩展性更好。

Websocket使用代码示例(在使用Websocket协议之前 确保安装Websocket库 这样有利于编程):

C/S架构

服务端代码:

// websocket_server.cpp  
#include <websocketpp/config/asio_no_tls.hpp>  
#include <websocketpp/server.hpp>  
  
typedef websocketpp::server<websocketpp::config::asio> server;  
  
void on_message(server* s, websocketpp::connection_hdl hdl, server::message_ptr msg) {  
    server::connection_ptr con = s->get_con_from_hdl(hdl);  
  
    // 接收到的消息  
    std::cout << "Received message from client: " << msg->get_payload() << std::endl;  
  
    // 发送回应消息给客户端  
    server::message_ptr response(new server::message);  
    response->set_payload("Hello, client!");  
    con->send(response);  
}  
  
int main() {  
    server websocket_server;  
  
    // 初始化WebSocket服务  
    websocket_server.set_access_channels(websocketpp::lib::bind(&allow_origin, websocket_server, ::std::placeholders::_1));  
    websocket_server.set_message_handler(&on_message);  
  
    // 监听端口  
    websocket_server.listen(9002);  
    websocket_server.start_accept();  
  
    // 运行服务器  
    websocket_server.run();  
  
    return 0;  
}

客户端代码

// websocket_client.cpp  
#include <websocketpp/config/asio_no_tls.hpp>  
#include <websocketpp/client.hpp>  
  
typedef websocketpp::client<websocketpp::config::asio> client;  
  
void on_message(client* s, websocketpp::connection_hdl hdl, client::message_ptr msg) {  
    // 接收到的服务端消息  
    std::cout << "Received message from server: " << msg->get_payload() << std::endl;  
}  
  
void on_connect(client* s, websocketpp::connection_hdl hdl) {  
    // 连接成功后的操作  
    std::cout << "Connected to server" << std::endl;  
  
    // 发送消息给服务端  
    client::connection_ptr con = s->get_con_from_hdl(hdl);  
    client::message_ptr msg(new client::message);  
    msg->set_payload("Hello, server!");  
    con->send(msg);  
}  
  
int main() {  
    client websocket_client;  
  
    // 初始化WebSocket客户端  
    websocket_client.set_message_handler(&on_message);  
    websocket_client.set_connect_handler(&on_connect);  
  
    // 连接到服务器  
    websocket_client.connect("ws://localhost:9002");  
  
    // 运行客户端,等待消息  
    websocket_client.run();  
  
    return 0;  
}

要编译这些代码,需要安装websocketpp库和C++编译器。以下是一个简单的编译命令示例(假设使用的是g++):

g++(Gcc编译器内部原理)命令:

g++ -o websocket_server websocket_server.cpp -lwebsocketpp -lasio -lpthread -lssl -lcrypto  
g++ -o websocket_client websocket_client.cpp -lwebsocketpp -lasio -lpthread -lssl -lcrypto

编译成功后,可以首先运行服务端程序websocket_server,然后再运行客户端程序websocket_client客户端应该会发送一条消息给服务端,并且服务端会回应一条消息给客户端。

请注意,这些代码不包含任何错误处理或高级功能,如并发连接、线程安全或SSL/TLS加密。在开发企业级项目使用时,请确保添加适当的错误处理和安全措施。以上仅仅是一个实例

好了 本篇文章就到这里结束了 在这里 小编想跟大家推荐一篇性价比很高的课程:

https://xxetb.xetslk.com/s/2PjJ3T

相关文章
|
网络协议 算法
WebSocket 技术详解
【2月更文挑战第12天】
374 1
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
存储 人工智能 大数据
「PAI-ArtLab100 AIGC」设计普惠计划发布!与 100+ 高校共同探索 AIGC 教育新路径
6月28日,D20全球设计院长峰会(简称D20峰会)在杭州阿里巴巴全球总部召开。峰会现场,阿里云高校合作部、阿里云人工智能平台PAI,以及阿里云设计中心联合发布「ArtLab100 AIGC设计普惠计划」(简称ArtLab100计划),与 100+ 高校共同探索 AIGC 教育新路径。旨在推动设计艺术教育与人工智能技术的深度结合,培育新时代的设计创新人才,同时加强校企合作,促进产业界与学术界的协同进步。
「PAI-ArtLab100 AIGC」设计普惠计划发布!与 100+ 高校共同探索 AIGC 教育新路径
|
11月前
|
监控 网络协议 应用服务中间件
深入解析:如何确定网站使用的端口号
【10月更文挑战第21天】 在网络通信中,端口号是识别特定服务的关键。一个IP地址可以有多个端口,每个端口可能运行着不同的服务。当我们在浏览器地址栏输入一个网址时,实际上是通过特定的端口与服务器进行通信。本文将探讨如何确定一个网站使用的端口号,以及端口号在网络通信中的作用。
793 4
|
前端开发 JavaScript 定位技术
Umi使用百度地图服务
Umi使用百度地图服务
367 0
|
API 开发者
Mailchimp邮箱API发送邮件的效果如何
Mailchimp的邮箱API让开发者能集成其功能,实现邮件自动化发送和营销管理。它提供丰富的模板、设计工具和强大的分析,助用户创建吸引人的邮件并追踪效果。通过获取API密钥并参照文档,开发人员可将Mailchimp整合进应用。Mailchimp的优秀客户支持和效果评估工具确保了良好的发送体验,是高效发送和优化邮件的优选方案。
|
算法 Java
什么是EL表达式
EL表达式,全称为Expression Language,意为表达式语言。它是Servlet规范中的一部分,也是JSP2.0规范加入的内容。EL表达式的主要作用是用于在Java Web应用中访问和操作数据,使得JSP页面能够摆脱Java代码块和JSP表达式,实现代码的简化。
379 3
|
Web App开发 缓存 JavaScript
六千字梳理 Node.js 的多进程模型和项目部署流程
本文介绍了 Node.js 中的多进程模型,以及如何将一个基于 Node.js 开发的 Web 应用,部署到服务器上,并且使用 PM2 工具进行管理,最终通过 Nginx 进行代理转发,对外提供服务。
793 0
|
Ubuntu Linux 人机交互
快速实现摄像头视频画面的远程预览
通过阿里云生活物联网平台的智能视频服务Link Visual来快速的搭建并实现摄像头视频画面的远程预览功能。
|
PHP
Typecho-handsome主题——时间轴日志模板
本篇文章主要讲述了如何为Typecho中handsome主题添加一个新的独立页面模板——时间轴日志
825 2
Typecho-handsome主题——时间轴日志模板