关于 WebSocket 和 HTTP 区别的思考以及一个最简单的 WebSocket 的客户端和服务器实现(2)

简介: 关于 WebSocket 和 HTTP 区别的思考以及一个最简单的 WebSocket 的客户端和服务器实现

问题:启用 Keep-Alive 头部字段后,重用的是 HTTP 连接,还是 TCP 连接?

WebSocket 并不是将 HTTP 的设计完全推翻重建,而是在 HTTP 的基础上增添了一些逻辑来,管理客户端和服务器端的流。这些流的内容也是 HTTP 请求和响应,保留了旧语义,只是编码和打包方式不同。


image.png


了解了理论知识后,我们动手开发一套最简单的 WebSocket 服务器端和客户端实现。


WebSocket 服务器端实现
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var defaultPort = 3001;
var port = process.env.PORT || defaultPort;
var i = 0;
console.log("Server is listening on port: " + defaultPort);
server.listen(port);
io.on('connection', function (socket) {
  console.log("connect comming from client: " + socket.id);
  socket.emit('messages_jerry', { hello: 'world greeting from Server!' });
  socket.on('messages', function (data) {
    console.log("data received from Client:" + JSON.stringify(data,2,2));
  });
});



代码实现包含了4个关键点:


  1. 服务器监听在默认的 3001 端口上。

  2. 一旦 WebSocket 客户端有发送到 3001 端口上的连接请求时,代码第 12 行的 on 监听函数触发,监听的事件名称为 connection,然后在监听函数的实现体里,打印出客户端连接的 id 值。

  3. 服务器端接收了客户端的链接后,向客户端通过第 15 行的 emit 方法,发送一个 messages_jerry 的事件,以及一个 JSON 对象作为事件负载。

  4. 第 17 行服务器端监听在 messages 事件上的监听函数触发时,说明接收到了从客户端发送过来的事件,在监听函数里打印出客户端传递过来的数据。


image.png


WebSocket 客户端实现

// #!/usr/bin/env node
const io = require('socket.io-client');
var socket = io.connect('http://localhost:3001');
socket.on('messages_jerry', function (data) {
    console.log("data sent from Server:" + JSON.stringify(data,2,2));
    socket.emit('messages', { my: 'data sent from Client' });
  });
socket.on('connect', function (socket2) {
    console.log('Connection with Server established!');
        socket.emit('messages', 'Client has established connection with Server');
});



代码的关键点:


  1. 客户端通过 connect 方法向 WebSocket 服务器发起连接请求

  2. 连接成功建立后,客户端第 10 行的 on 监听函数触发,该函数监听在 connect 事件上,会在 Web Socket 连接成功建立后自动触发。

  3. 客户端在第 12 行调用 emit 向服务器发送一个 messages 事件。

  4. 客户端监听在 messages_jerry 的监听函数触发,说明服务器端有数据到达。使用第 6 行的 console.log 语句打印出这个数据。

  5. 在第 7 行代码,客户端调用 emit,向服务器端发送一个请求,通知服务器自己已经收到了服务器发送过来的数据。

image.png


使用命令行 node wsServer.js 启动服务器端,看到如下输出:


image.png


新开一个命令行窗口,使用 node wsClient.js 启动客户端,能看到客户端打印出的成功建立连接,以及从服务器端发送过来的数据:


image.png


切换回服务器端,红色高亮的内容,就是客户端与服务器端建立连接之后,服务器端新打印出的数据:


image.png

回到本文开头抛出的问题:


问题1

为什么 Cypress 的 visit 方法选择了 WebSocket 作为与目标网站的通信技术呢?为什么不直接走 HTTP 协议,比如用 ES6 原生支持的 fetch 去访问目标网站呢?


笔者猜测,是不是因为 Cypress 里某些 API,比如 cy.XXX 需要利用到 WebSocket 这种全双工通信的特性才能够充分发挥作用?


问题2

那么问题又来了,在我们 cy.visit('http://xxx.com') 的代码里,如果说最终 Cypress 通过 WebSocket 协议向 http://xxx.com 发送数据报,但是 http://xxx.com 不支持 WebSocket 怎么办?就像本文前一部分介绍的例子一样,WebSocket 需要客户端和服务器端同时支持才行。


那么会不会 cy.visit 和 visit 参数里指定的 webSite 之间,还存在着一个中间层?


image.png


问题3

WebSocket Connection,HTTP Connection,TCP connection,这三者的区别和联系是什么?


参考资料

Difference between HTTP and WebSocket (HTTP 2.0 )



相关文章
|
15天前
|
弹性计算 大数据 数据处理
阿里云服务器实例哪些属于入门级,哪些是企业级?有何区别?
阿里云服务器的实例规格从级别上来说分为入门级和企业级,从实例规格种类上来说,又分为突发性能型、共享型、计算型、通用型、内存型、大数据型等,2024年截止目前在阿里云的活动中,可选的云服务器实例规格有轻量应用服务器、经济型e、通用算力型u1、计算型c7、计算型c7a、计算型c8a、计算型c8y、通用型g7、通用型g7a、通用型g8a、通用型g8i、通用型g8y、内存型r7、内存型r8y等,有的新手用户不是很清楚2024年阿里云活动中的云服务器实例哪些属于入门级,哪些是企业级?有何区别?下面根据官方的各种资料介绍为大家解答下这些疑问,帮助您能更清楚地了解阿里云服务器,快速找到自己对云服务器产品的需
阿里云服务器实例哪些属于入门级,哪些是企业级?有何区别?
|
21天前
|
XML Java 数据格式
Servlet 教程 之 Servlet 客户端 HTTP 请求 3
该教程展示了如何在Servlet中处理客户端HTTP请求,特别是获取HTTP头信息。示例代码创建了一个名为`DisplayHeader`的Servlet,它扩展了`HttpServlet`并重写了`doGet`方法。在`doGet`中,使用`HttpServletRequest`的`getHeaderNames()`遍历所有头部,显示其名称和对应值。Servlet在TomcatTest项目下,通过`web.xml`配置映射到`/TomcatTest/DisplayHeader`路径。
31 14
|
21天前
|
安全 Java 网络安全
Servlet 教程 之 Servlet 客户端 HTTP 请求 2
Servlet教程介绍了如何在Servlet中处理HTTP请求,包括获取Cookie、头信息、参数、Session等。方法如:`getCookies()`、`getAttributeNames()`、`getHeaderNames()`、`getParameterNames()`等。还能获取身份验证类型、字符编码、MIME类型、请求方法、远程用户信息、URL路径、安全通道状态以及请求内容长度等。此外,可通过`getSession()`创建或获取Session,并以`Map`形式获取参数。
24 8
|
13天前
|
网络协议 安全 数据安全/隐私保护
Socks5代理和HTTP代理的区别在哪里?
Socks5和HTTP代理是两种IP代理方式,分别基于Socks5及HTTP协议。Socks5支持TCP/UDP,适合P2P、游戏和流媒体,提供传输层身份验证。HTTP代理仅支持HTTP,适用于Web浏览控制和内容过滤。选择代理应根据实际需求,如需高速低延迟选Socks5,需访问控制选HTTP。
|
2天前
|
安全 网络协议 网络安全
干货|代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理
HTTP和HTTPS是互联网主要的两大协议,HTTP是基础的简单请求-响应协议,常用于TCP上,但数据传输不安全。HTTPS是HTTP的安全版本,添加了SSL层进行加密和身份验证,提供更高的安全性,用于保护数据和验证网站真实性。HTTPS需CA证书,可能产生费用,并使用443端口而非HTTP的80端口。
|
2天前
|
网络协议 安全 数据安全/隐私保护
干货|代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理
SOCKS5和HTTP是两种代理协议,前者是通用型,支持多种网络流量,提供身份验证、IPv6支持及UDP兼容性,更适合实时数据传输。HTTP代理专用于HTTP协议,适用于Web资源请求。SOCKS5在传输方式、功能、兼容性和安全性上更胜一筹,而HTTP代理则在处理HTTP请求时更专业。选择代理协议应根据需求和应用场景,考虑服务的稳定性和安全性。付费代理如kookeey全球代理,支持双协议,速度快且可扩展性强,是可靠的选择。
|
2天前
|
JSON 数据格式 Python
Python 的 requests 库是一个强大的 HTTP 客户端库,用于发送各种类型的 HTTP 请求
`requests` 库是 Python 中用于HTTP请求的强大工具。要开始使用,需通过 `pip install requests` 进行安装。发送GET请求可使用 `requests.get(url)`,而POST请求则需结合 `json.dumps(data)` 以JSON格式发送数据。PUT和DELETE请求类似,分别调用 `requests.put()` 和 `requests.delete()`。
13 2
|
3天前
|
JavaScript 前端开发 搜索推荐
Vue 的服务器端渲染(SSR)和客户端渲染(CSR)在渲染过程、性能、用户体验等方面都存在显著的区别
【5月更文挑战第8天】Vue 的 SSR 和 CSR 在渲染上有明显差异。SSR 服务器端生成 HTML 返回给浏览器,提供更快首屏加载和更好的 SEO,但增加服务器负担。CSR 客户端渲染,首次加载可能较慢,但交互更流畅,开发更简单。两者各有优劣,需根据项目需求权衡选择。
11 2
|
4天前
|
数据库 数据中心 虚拟化
云服务器和虚拟主机有什么区别
总的来说,云服务器提供更高级别的灵活性、控制和资源隔离,适用于需要定制化和更大资源的应用程序。虚拟主机是一种经济实惠的共享托管解决方案,适用于小型项目和个人网站。选择哪种服务取决于你的需求、预算和技术要求。
22 3
|
5天前
|
存储 弹性计算 固态存储
阿里云服务器系统盘与数据盘ESSD AutoPL、ESSD云盘、SSD云盘区别及选择参考
阿里云系统盘与数据盘如何选择?目前阿里云服务器有ESSD AutoPL、高效云盘、ESSD云盘、SSD云盘可供选择,很多新手用户并不清楚他们之间的区别,也就不知道应该如何选择,因为不同的云盘在最大IOPS、最大吞吐量等性能上是有区别的,下面我们一起来他们之间的区别,这样就有助于我们选择适合自己需求的系统盘与数据盘了。
阿里云服务器系统盘与数据盘ESSD AutoPL、ESSD云盘、SSD云盘区别及选择参考