小工程#4:WebSockets
再次问好!
最近,我正在开发一个网站,需要定期从服务器提取数据,但这并不是必需的,因为数据库大约每周只更新一次。但我仍然认为,如果我可以定期从服务器获取数据,而无需从客户端请求数据,那就太好了。于是,我遇到了套接字服务器!
它基本上允许客户端和服务器之间的双向通信。我们还可以设置超时方法,以便服务器定期自动向客户端发送数据。
因此我对这个主题进行了一些研究,并从 chatgpt 获得了一些帮助:)
但我也喜欢向经验丰富的工程师学习,而不是从常规课程中学习。我钦佩的工程师之一是@husseinnasser。我还参加了 Nasser 关于 WebSockets 的速成课程。因为作为一名非 CSE 学生,我并不真正了解底层连接是如何工作的。所以我需要从头开始学习!
这确实是一次很棒的经历。我第一次了解了协议!HTTP、HTTP 1.1、TCP、UDP
这为我理解 WebSocket 服务器中发生的情况奠定了良好的基础。
然后我使用 http 创建了一个原始的 websokcet 服务器。我设置了某些断点并测试了服务器和客户端之间的连接。这是一种独特的学习方式,因为我没有为此编写太多前端代码。相反,我通过直接从浏览器控制台发送客户端消息来测试客户端!
首先我们需要一个基本的 http 服务器:
基本套餐要求及连接:

现在这里有一个空的连接变量,我们稍后会讨论它。
基础 http 服务器启动:

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

服务器监听:

websocket 服务器可以选择是否接受请求,
接受发送回交换协议 101 响应,从而开启客户端和服务器之间的全双工通信
第一个参数是自定义协议,可以用于聊天、游戏,null 表示我们接受任何东西,不需要特定的协议
第二个参数 - 我们可以检查请求的来源,通常是发送请求的 URL,以检查它是否是可信来源
以下是我们可以使用事件,打开、关闭、消息等。WebSockets 的要点就是拥有这些事件。
当每个事件发生时,我们可以自动从服务器获得一定的响应,而无需客户端发起请求
套接字事件:

注意,我们在这里看到了我们在开始时发起的空连接。这告诉服务器我们可以接受任何内容。任何类型的数据都可以接受,因为我们只是在测试。
现在我们可以在服务器和客户端之间发送和接收连接
我们可以从 VS Code 中的调试控制台发送服务器消息:

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

只要没有人关闭连接,连接就会保持打开状态。
如果服务器关闭,连接将关闭
如果客户端浏览器启动事件“ws.close”,则连接将关闭。
但这只是基本的连接。现在我们将创建一个函数,该函数将定期从 WebSocket 服务器向客户端发送消息。想想游戏流媒体、twitch、视频流媒体等。

打开连接后传入函数:

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

瞧,我们刚刚在服务器和客户端之间建立了全双工双向通信。
学习起来超级有趣!
代码库:
ShatilKhan / 套接字服务器
探索套接字服务器的工作原理
套接字服务器
探索套接字服务器的工作原理
在 GitHub 上查看观看视频来查看代码的实际效果: