本篇文章我们聊一下Websocket这个话题 这是学习计算机的人们常常聊起的一个话题。
前言
WebSocket的出现,使得浏览器具备了实时双向通信的能力。本文由浅入深,介绍了WebSocket如何建立连接、交换数据的细节,以及数据帧的格式。此外,还简要介绍了针对WebSocket的安全攻击,以及协议是如何抵御类似攻击的。
2.什么是websocket?
HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。
对大部分web开发者来说,上面这段描述有点枯燥,其实只要记住几点:
- WebSocket可以在浏览器里使用
- 支持双向通信
- 使用很简单
- 基于TCP/IP协议
优点:
- 支持双向通信,实时性更强。
- 更好的二进制支持。
- 较少的控制开销。连接创建后,ws客户端、服务端进行数据交换时,协议控制的数据包头部较小。在不包含头部的情况下,服务端到客户端的包头只有2~10字节(取决于数据包长度),客户端到服务端的的话,需要加上额外的4字节的掩码。而HTTP协议每次通信都需要携带完整的头部。
- 支持扩展。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加密。在开发企业级项目使用时,请确保添加适当的错误处理和安全措施。以上仅仅是一个实例
好了 本篇文章就到这里结束了 在这里 小编想跟大家推荐一篇性价比很高的课程: