小工程#4:WebSockets

再次问好!

最近,我正在开发一个网站,需要定期从服务器提取数据,但这并不是必需的,因为数据库大约每周只更新一次。但我仍然认为,如果我可以定期从服务器获取数据,而无需从客户端请求数据,那就太好了。于是,我遇到了套接字服务器!

它基本上允许客户端和服务器之间的双向通信。我们还可以设置超时方法,以便服务器定期自动向客户端发送数据。

因此我对这个主题进行了一些研究,并从 chatgpt 获得了一些帮助:)

但我也喜欢向经验丰富的工程师学习,而不是从常规课程中学习。我钦佩的工程师之一是@husseinnasser。我还参加了 Nasser 关于 WebSockets 的速成课程。因为作为一名非 CSE 学生,我并不真正了解底层连接是如何工作的。所以我需要从头开始学习!

这确实是一次很棒的经历。我第一次了解了协议!HTTP、HTTP 1.1、TCP、UDP

这为我理解 WebSocket 服务器中发生的情况奠定了良好的基础。

然后我使用 http 创建了一个原始的 websokcet 服务器。我设置了某些断点并测试了服务器和客户端之间的连接。这是一种独特的学习方式,因为我没有为此编写太多前端代码。相反,我通过直接从浏览器控制台发送客户端消息来测试客户端!

首先我们需要一个基本的 http 服务器:

基本套餐要求及连接:

Image description

现在这里有一个空的连接变量,我们稍后会讨论它。

基础 http 服务器启动:

Image description

但这只是一个请求-响应服务器。一旦收到响应,连接就会断开。我们需要一个可靠的连接。这就是 TCP 的作用所在。当我将此 http 服务器传入 WebSocket 服务器时,它会从客户端向服务器发送 UPGRADE 1.1 标头请求。它将请求将协议从 http 切换到 http 1.1 并建立 TCP 连接以进行全双工通信。

将 http 服务器传入 websocket 服务器以创建 TCP 连接:

Image description

服务器监听:

Image description

websocket 服务器可以选择是否接受请求,

接受发送回交换协议 101 响应,从而开启客户端和服务器之间的全双工通信

第一个参数是自定义协议,可以用于聊天、游戏,null 表示我们接受任何东西,不需要特定的协议

第二个参数 - 我们可以检查请求的来源,通常是发送请求的 URL,以检查它是否是可信来源

以下是我们可以使用事件,打开、关闭、消息等。WebSockets 的要点就是拥有这些事件。

当每个事件发生时,我们可以自动从服务器获得一定的响应,而无需客户端发起请求

套接字事件:

Image description

注意,我们在这里看到了我们在开始时发起的空连接。这告诉服务器我们可以接受任何内容。任何类型的数据都可以接受,因为我们只是在测试。

现在我们可以在服务器和客户端之间发送和接收连接

我们可以从 VS Code 中的调试控制台发送服务器消息:

Image description

然后从浏览器控制台,我们可以发送客户端响应:

Image description

只要没有人关闭连接,连接就会保持打开状态。

如果服务器关闭,连接将关闭

如果客户端浏览器启动事件“ws.close”,则连接将关闭。

但这只是基本的连接。现在我们将创建一个函数,该函数将定期从 WebSocket 服务器向客户端发送消息。想想游戏流媒体、twitch、视频流媒体等。

Image description

打开连接后传入函数:

Image description

我们可以使用“onmessage”事件在客户端记录此消息流

Image description

瞧,我们刚刚在服务器和客户端之间建立了全双工双向通信。

学习起来超级有趣!

代码库:

ShatilKhan / 套接字服务器

探索套接字服务器的工作原理

套接字服务器

探索套接字服务器的工作原理

在 GitHub 上查看

观看视频来查看代码的实际效果: