套接字服务器
探索套接字服务器的工作原理
你好!
最近我在开发一个网站,需要定期从服务器拉取数据。其实数据库一周才更新一次,所以这个需求并不迫切。但我还是觉得,如果能有一种方法可以定期从服务器获取数据,而无需客户端请求,那就太好了。于是,我接触到了Socket服务器!
它基本上允许客户端和服务器之间进行双向通信。我们还可以设置超时机制,让服务器定期自动向客户端发送数据。
所以我稍微研究了一下,也从chatgpt那里得到了一些帮助 :)
不过,我更喜欢向经验丰富的工程师学习,而不是参加常规课程。我非常欣赏的工程师之一是@husseinnasser。我还参加了Nasser关于WebSocket的速成课程。因为我不是计算机科学专业的学生,所以对底层连接的工作原理并不了解。因此,我需要从零开始学习!
这确实是一次很棒的经历。我首先学习了协议! HTTP、HTTP 1.1、TCP 和 UDP
为我理解 WebSocket 服务器的工作原理打下了良好的基础。
之后,我使用 HTTP 协议搭建了一个原始的 WebSocket 服务器。我设置了一些断点,并测试了服务器和客户端之间的连接。这是一种独特的学习方式,因为我几乎没写前端代码。相反,我直接通过浏览器控制台发送客户端消息来测试客户端!
首先我们需要一个基本的HTTP服务器:
基本软件包要求和连接: 现在这里有一个空的连接变量,我们稍后再讨论它。
但这只是一个请求-响应服务器。一旦收到响应,连接就会断开。我们需要一个可靠的连接。这就是 TCP 的作用所在。当我将这个 HTTP 服务器传递给 WebSocket 服务器时,客户端会向服务器发送一个 UPGRADE 1.1 标头请求。它会请求将协议从 HTTP 切换到 HTTP 1.1,并建立一个用于全双工通信的 TCP 连接。
将 HTTP 服务器传递给 WebSocket 服务器以创建 TCP 连接:
服务器正在监听:
WebSocket 服务器可以选择是否接受请求。
接受请求会返回切换协议的 101 响应,从而建立客户端和服务器之间的全双工通信。
第一个参数是自定义协议,例如用于聊天、游戏等;如果为 null,则表示接受任何协议的请求。
第二个参数用于检查请求的来源,通常是请求发送的 URL,以确认其是否为可信来源。
以下是我们可以使用的事件:open、close、message 等。WebSocket 的核心在于这些事件。
当每个事件发生时,我们可以自动从服务器获得相应的响应,而无需客户端发起请求
。套接字事件:

注意这里我们看到了一开始建立的空连接。这告诉服务器我们可以接受任何数据。由于我们只是在测试,所以任何类型的数据都可以接受。
现在我们可以在服务器和客户端之间发送和接收连接了。
在 VS Code 的调试控制台中,我们可以发送服务器消息:
然后,我们可以从浏览器控制台发送客户端响应:
只要没有人主动关闭连接,连接就会一直保持打开状态。
如果服务器关闭,
或者客户端浏览器发起关闭事件,连接也会关闭ws.close。
但这只是基本的连接。接下来,我们将创建一个函数,定期从 WebSocket 服务器向客户端发送消息。可以参考游戏直播、Twitch 直播、视频直播等应用场景。
连接建立后,传入该函数:
onmessage我们可以使用事件在客户端记录这一系列消息。
瞧!我们刚刚实现了服务器和客户端之间的全双工双向通信。
学习这些内容超级有趣!
代码库:
观看视频即可了解代码的实际运行效果: