文章目录

  • 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. bind函数作用、应用场景以及模拟实现
  2. 使用HtmlUnit获取html页面
  3. 【前端酷站】分享一个纯 Javascript 的图表库与立体像素风制作~
  4. 利用CSS的三列等高布局
  5. FastDFS分布式文件系统设计原理
  6. 15-CSS基础-浮动流
  7. javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint
  8. meteor 结合mysql_Meteor集合
  9. Jmeter系列之no-gui模式
  10. 1.两数之和-LeetCode
  11. [HDU3683 Gomoku]
  12. 小学计算机信息论文题目,小学计算机论文
  13. 路由器、交换机、网关
  14. 解决新版本谷歌浏览器CROS跨域问题
  15. Document.readyState 如何使用和侦听
  16. mysql经典sql语句大全_经典SQL语句大全(sql查询语句大全集锦)
  17. Spring - 解决 SpringUtil getBean NPE 问题
  18. 走进小程序【九】微信小程序【云开发】
  19. 学生学籍管理系统_管理员登陆对学生的信息进行操作
  20. 什么是Eureka?

热门文章

  1. L2 元年,Arbitrum Nitro 升级带来更兼容高效的开发体验
  2. C习题:利用梯形法计算定积分
  3. 【真人手势动画制作软件】万彩手影大师教程 | 添加镜头
  4. Linux 组管理和权限管理
  5. 解决The origin server did not find a current representation for the target resource or is not导致的404问题
  6. Word中度量单位的设定
  7. 大括号分段函数怎么打?
  8. 靠外教资质赢取市场信任,阿卡索的在线英语差异化玩法能否奏效?
  9. 计算机应用基础实训作业与要求,计算机应用基础实训内容及项目设计
  10. MySQL中SQL生命周期与执行流程