websocketpp 使用安装与使用
WebSocket是从HTML5开始支持的一种网页端和服务端保持长连接的 消息推送机制。•传统的web程序都是属于一问一答的形式,即客户端给服务器发送了一个HTTP请求,服务器给客户端返回一个HTTP响应。这种情况下服务器是属于被动的一方,如果客户端不主动发起请求服务器就无法主动给客户端响应•像网页即时聊天或者我们做的五子棋游戏这样的程序都是非常依赖消息推送的,即需要服务器主动推动消息到客户端。如
·
1.介绍与使用
Websocket 协议介绍
WebSocket 是从 HTML5 开始支持的一种网页端和服务端保持长连接的 消息推送机制。
• 传统的 web 程序都是属于 "一问一答" 的形式,即客户端给服务器发送了一个
HTTP 请求,服务器给客户端返回一个 HTTP 响应。这种情况下服务器是属于被动的
一方,如果客户端不主动发起请求服务器就无法主动给客户端响应
• 像网页即时聊天或者我们做的五子棋游戏这样的程序都是非常依赖 "消息推送" 的,
即需要服务器主动推动消息到客户端。如果只是使用原生的 HTTP 协议,要想实现消
息推送一般需要通过 "轮询" 的方式实现, 而轮询的成本比较高并且也不能及时的获取
到消息的响应。
基于上述两个问题, 就产生了 WebSocket 协议。WebSocket 更接近于 TCP 这种级别
的通信方式,一旦连接建立完成客户端或者服务器都可以主动的向对方发送数据。
原理解析
WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客
户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,
包含了一些附加头信息,通过这个附加头信息完成握手过程并升级协议的过程。
2.安装
apt-get install libboost-dev libboost-system-dev libwebsocketpp-dev
安装完毕后,若在 /usr/include 下有了 websocketpp 目录就表示安装成功了
3.Websocketpp 介绍
WebSocketpp 是一个跨平台的开源(BSD 许可证)头部专用 C++库,它实现了
RFC6455(WebSocket 协议)和 RFC7692(WebSocketCompression Extensions)。
它允许将 WebSocket 客户端和服务器功能集成到 C++程序中。在最常见的配置中,全
功能网络 I/O 由 Asio 网络库提供。
WebSocketpp 的主要特性包括:
• 事件驱动的接口
• 支持 HTTP/HTTPS、WS/WSS、IPv6
• 灵活的依赖管理 — Boost 库/C++11 标准库
• 可移植性:Posix/Windows、32/64bit、Intel/ARM
• 线程安全
WebSocketpp 同时支持 HTTP 和 Websocket 两种网络协议
下面是该项目的一些常用网站, 大家多去学习。
• github:https://github.com/zaphoyd/websocketpp
• 用户手册: http://docs.websocketpp.org/
• 官网:http://www.zaphoyd.com/websocketpp
4.websocketpp 简单使用
main.cpp
#include<websocketpp/config/asio_no_tls.hpp>
#include<websocketpp/server.hpp>
#include<iostream>
#include<string>
typedef websocketpp::server<websocketpp::config::asio> server;
using namespace std;
void on_open(websocketpp::connection_hdl hdl)
{
std::cout << "长连接建立成功" << std::endl;
}
void on_close(websocketpp::connection_hdl hdl)
{
std::cout << "长连接断开" << std::endl;
}
void on_message(server *server, websocketpp::connection_hdl hdl, server::message_ptr msg)
{
// 获取消息内容
std::string msg_str = msg->get_payload();
// 输出收到的消息
cout << "收到消息:" << msg_str << endl;
// 通过连接句柄获取连接对象
auto connection_hdl = server->get_con_from_hdl(hdl);
// 发送回显消息并附加" hello!"
connection_hdl->send(msg_str + " hello!", websocketpp::frame::opcode::value::text);
}
int main()
{
server server;
// 设置服务器访问日志级别为无
server.set_access_channels(websocketpp::log::alevel::none);
// 初始化Asio库
server.init_asio();
// 设置连接打开时的回调函数
server.set_open_handler(on_open);
// 设置连接关闭时的回调函数
server.set_close_handler(on_close);
// 设置消息处理函数
auto set_message_handler = std::bind(&on_message, &server, std::placeholders::_1, std::placeholders::_2);
server.set_message_handler(set_message_handler);
// 允许地址复用
server.set_reuse_addr(true);
// 监听9092端口
server.listen(9092);
// 开始接受连接
server.start_accept();
// 运行服务器
server.run();
return 0;
}
makefile
main:main.cpp
g++ $^ -o $@ -std=c++17 -lpthread -lboost_system
@PHNOY:clean
clean:
rm -f main
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,
initial-scale=1.0">
<title>Test Websocket</title>
</head>
<body>
<input type="text" id="message">
<button id="submit">提交</button>
<script>
// 创建 websocket 实例
// ws://192.168.51.100:8888
// 类比 http
// ws 表示 websocket 协议
// 192.168.51.100 表示服务器地址
// 8888 表示服务器绑定的端口
let websocket = new WebSocket("ws://192.168.45.129:9092");
// 处理连接打开的回调函数
websocket.onopen = function() {
console.log("连接建立");
}
// 处理收到消息的回调函数
// 控制台打印消息
websocket.onmessage = function(e) {
console.log("收到消息: " + e.data);
}
// 处理连接异常的回调函数
websocket.onerror = function() {
console.log("连接异常");
}
// 处理连接关闭的回调函数
websocket.onclose = function() {
console.log("连接关闭");
}
// 实现点击按钮后, 通过 websocket 实例 向服务器发送请求
let input = document.querySelector('#message');
let button = document.querySelector('#submit');
button.onclick = function() {
console.log("发送消息: " + input.value);
websocket.send(input.value);
}
</script>
</body>
</html>
测试截图


至此大家就可以安装和简单使用websocketpp协议了!
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)