文章目录

  • WebSocket简介
    • WebSocket 产生背景
    • WebSocket 的定义
    • WebSocket 握手过程
    • WebSocket 通信协议
  • 示例代码
    • js示例代码
    • c++示例代码

WebSocket简介

WebSocket 产生背景

在 WebSocket 协议出现以前,创建一个和服务端进行双通道通信的 web 应用,需要依赖HTTP协议进行不停的轮询,这会导致一些问题:

  • 服务端被迫维持来自每个客户端的大量不同的连接
  • 大量的轮询请求会造成高开销,比如会带上多余的header,造成了无用的数据传输

所以,为了解决这些问题,WebSocket 协议应运而生。

WebSocket 的定义

WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。

在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。

WebSocket 握手过程

客户端请求

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13

服务器回应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Location: ws://example.com/

WebSocket 通信协议

WebSocket 通信协议本文居于篇幅,就不展开说明,感兴趣的推荐阅读下面这篇博文:

WebSocket协议:5分钟从入门到精通

示例代码

js示例代码

见 html/websocket_client.html

function WebSocketTest(url) {var ws = new WebSocket(url);ws.onopen = function() {alert("连接已建立");ws.send("hello");};ws.onmessage = function(ev) {var received_msg = ev.data;console.log("received websocket message: " + received_msg);};ws.onclose = function() {alert("连接已关闭");};
}

c++示例代码

libhv提供的WebSocketClient类使用起来与JS的WebSocket一样简单。

示例代码见 examples/websocket_client_test.cpp

#include "WebSocketClient.h"using namespace hv;int main(int argc, char** argv) {if (argc < 2) {printf("Usage: %s url\n", argv[0]);return -10;}const char* url = argv[1];WebSocketClient ws;ws.onopen = [&ws]() {printf("onopen\n");ws.send("hello");};ws.onclose = []() {printf("onclose\n");};ws.onmessage = [](const std::string& msg) {printf("onmessage: %s\n", msg.c_str());};// reconnect: 1,2,4,8,10,10,10...ReconnectInfo reconn;reconn.min_delay = 1000;reconn.max_delay = 10000;reconn.delay_policy = 2;ws.setReconnect(&reconn);ws.open(url);// press Enter to stopwhile (getchar() != '\n');return 0;
}

编译运行:

c++ -std=c++11 examples/websocket_client_test.cpp -o bin/websocket_client_test -I/usr/local/include/hv -lhv -lpthread
bin/websocket_client_test ws://127.0.0.1:8888/

libhv教程13--创建一个简单的WebSocket客户端相关推荐

  1. libhv教程11--创建一个简单的HTTP客户端

    文章目录 简单的同步HTTP客户端示例 简单的异步HTTP客户端示例 完整的HTTP客户端示例 简单的同步HTTP客户端示例 同步http客户端接口模拟实现了python的requests #incl ...

  2. 用C++创建一个简单的FTP客户端

    // MFCAppFtpDlg.cpp: 实现文件 //#include "pch.h" #include "framework.h" #include &qu ...

  3. ROS2入门教程—创建一个简单的订阅者和发布者(C++版)

    ROS2入门教程-创建一个简单的订阅者和发布者(C++版) 1 创建功能包 2 创建发布者节点 3 设置发布者节点依赖项 4 设置发布者节点编译规则 5 创建订阅者 6 编译并运行   节点是通过RO ...

  4. java qq ui界面_java swing 创建一个简单的QQ界面教程

    记录自己用java swing做的第一个简易界面. LoginAction.java package com.QQUI0819; import javax.swing.*; import java.a ...

  5. 如何用 Node.js 实现一个简单的 Websocket 服务?

    最近正在研究 Websocket 相关的知识,想着如何能自己实现 Websocket 协议.到网上搜罗了一番资料后用 Node.js 实现该协议,倒也没有想象中那么复杂,除去注释语句和 console ...

  6. Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏

    Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏 即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的.实际上,Unity在2013年发布 ...

  7. Scott Mitchell 的ASP.NET 2.0数据教程之一: 创建一个数据访问层

    原文 | 下载本教程中的编码例子 | 下载本教程的英文PDF版 导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研 ...

  8. 使用SpringBoot搭建一个简单的webSocket服务

    前言 个人地址:使用SpringBoot搭建一个简单的webSocket服务 什么是WebSocket? WebSocket是一个HTML5新增的协议,它的目的在浏览器和服务器之间建立一个不受限的双向 ...

  9. Spring MVC:使用基于Java的配置创建一个简单的Controller

    这是我博客上与Spring MVC相关的第一篇文章. 开端总是令人兴奋的,因此我将尽量简洁明了. Spring MVC允许以最方便,直接和快速的方式创建Web应用程序. 开始使用这项技术意味着需要Sp ...

最新文章

  1. linux ping策略打开_Linux禁止ping以及开启ping的方法
  2. 系统的MAC地址修改
  3. sql从某不连续的数字中将其分段并找出缺失的数字并分段
  4. c语言出勤成绩,C语言课程设计学生考勤系统文档推荐 (10页)-原创力文档
  5. 三菱d700变频器接线图_图解PLC与变频器通讯接线
  6. 华为发布基于自进化AI的HiSec Insight安全态势感知系统
  7. android驱动测试,Android: 通过 cucumber 驱动 monkey 做稳定性测试
  8. php7cms框架,GitHub - itsky71/itskycms: 基于ThinkPHP框架的一个CMS系统
  9. 完美配置Tomcat的HTTPS
  10. hping3发送MTU大包无法正确设置DF标志patch
  11. 最全CAD快捷键命令大全(图文版、文字版、键盘版)
  12. 史上最狠的十二星座分析
  13. Bandizip下载网盘地址
  14. 【stm32CubeMX】STM32F103c8t6串口通信
  15. 为什么工作三年的程序员还不懂APM与调用链技术?
  16. 17年1月9日,小程序来了。深度解析2017微信公开课
  17. 详细介绍idea实现javaweb项目登入注册(华东交通大学教务处信息管理系统)、模糊查询...
  18. 电脑双屏显示器小工具UltraMon
  19. 佳木斯大学计算机专业宿舍,佳木斯大学宿舍条件,宿舍几人间环境好不好(图片)...
  20. 万卷书 - 自律就是自由 Discipline Equals Freedom

热门文章

  1. 频域判断波形_基桩低应变检测波形影响因素的分析
  2. occt_modeling_data(一)——拓扑
  3. python语句命令的概念_python学习笔记(一):基本概念
  4. 创业大赛策划承办机构|创成汇
  5. 如何编写自己的缓冲区溢出利用程序(下)(转)
  6. 这才是计算机科学_计算机大量应用
  7. Webp图片怎么打开?如何转成JPG图片?
  8. yolov5-master训练陷入内核死循环
  9. python获取PST(太平洋)时间
  10. C语言程序设计-第四版-何钦铭-课后习题答案