---
title: "什么是 WebSocket，它是如何工作的"
description: "Web3 中的 WebSocket：定义与工作原理"
---

# 什么是 WebSocket，它是如何工作的

WebSocket 是一种基于 TCP 的双向通信协议，用于规范客户端与服务器之间的通信，允许双方互相请求数据。相比之下，像 HTTP 这样的单向协议只允许客户端向服务器请求数据。

只要客户端和服务器双方希望维持连接，WebSocket 连接就可以一直保持打开状态，从而实现持续通信。

而在 HTTP 中，每次连接都以客户端发起请求开始，以请求得到满足结束。

对于 Web3 dApp 通知而言，WebSocket 可能更具优势，因为与需要逐一发起请求相比，它能持续为关键事件提供[实时通知](https://www.alchemy.com/docs/reference/webhooks-overview)。像 [Alchemy Notify](https://www.alchemy.com/notify?a=e35dd0b6f1) 这样的工具让为钱包和 [应用](https://www.alchemy.com/dapps/top/defi-dapps) 添加实时通知变得简单。

## 什么是 WebSocket？

**WebSocket 是一种双向通信协议，能够在客户端和服务器之间建立交互式通信会话**。它基于 TCP，常用于需要实时通知能力的应用和服务。

### 什么是 WebSocket 服务器？

**WebSocket 服务器是一种按照特定协议监听某个 TCP 端口的应用程序。** WebSocket 是客户端与服务器之间的双向通信协议，允许双方互相请求和发送数据。

相比之下，HTTP 是单向通信协议，客户端只能向服务器发送请求，服务器只能作为响应回传数据——在 HTTP 关系中服务器永远不能向客户端发起请求。

### 什么是 WebSocket 连接？

**WebSocket 连接是客户端与服务器之间的持续连接**。相比之下，HTTP 连接是一次性的。连接随客户端每次发起请求而开始，随服务器的响应而结束。只要客户端和服务器双方希望保持连接打开，WebSocket 连接就可以一直维持——也就是说，数据可以在同一个初始请求建立的连接上持续流动，只要双方需要。

### WebSocket 使用什么协议？

**WebSocket 使用 WS 协议，该协议基于传输控制协议（TCP）**。这是一种面向连接的网络，意味着必须先在参与方之间建立连接，才能将数据路由到正确的位置。

相比之下，网际协议（IP）根据数据包内的信息来决定数据发送的位置，不需要预先建立连接就能路由该数据包。

### 什么是 WebSocket API？

服务器向客户端发送数据有两种方式。客户端可以定期向服务器请求数据，这称为**轮询（polling）**；或者服务器可以主动将数据发送给客户端，这称为**服务器推送（server push）**。

WebSocket API 利用客户端与服务器之间的连接，在初始请求之后保持连接打开，采用服务器推送技术，从而消除了客户端不断轮询服务器获取新更新所带来的基础设施压力。

## WebSocket 是如何工作的？

WebSocket 是一种双向通信方式，允许针对单次服务器请求返回多次响应。WebSocket 主要用于客户端与服务器之间的通信，而 webhook 主要用于服务器与服务器之间的通信。

### WebSocket 与 webhook 的工作方式有何不同？

与 WebSocket 不同，使用 HTTP 的 [webhook](http://www.alchemy.com/overviews/what-is-a-webhook) 是严格单向的：服务器只在收到请求时才响应应用程序，并且每次请求完成后连接就会终止。

[Alchemy Notify 使用 webhook](https://www.alchemy.com/docs/reference/notify-api-quickstart) 在服务器之间进行通信，并使用 WebSocket 将通知推送给 dApp 用户。

## Web3 WebSocket 有哪些用途？

[Alchemy 的 Subscription API](https://www.alchemy.com/docs/reference/subscription-api) 提供了两个新的 API 方法，扩展了原有 Ethereum API 的功能——**eth_subscribe** 和 **eth_unsubscribe**——使 Web3 开发者能够使用 WebSocket 持续接收信息或数据，例如获取待处理交易信息、待处理交易哈希、新区块头以及日志。

以下是 Alchemy 的 Subscription API 中使用 WebSocket 支持的方法：

- **alchemy_newFullPendingTransactions** - 返回所有被加入待处理状态的交易的完整交易信息（而不仅仅是交易哈希）
- **​​alchemy_filteredNewFullPendingTransactions** - 返回所有与 to 或 from 地址过滤条件匹配的待处理交易的交易信息
- **newPendingTransactions** - 返回所有被加入待处理状态的交易的哈希，无论是否由你发出
- **newHeads** - 每当有新区块头（block）添加到区块链时发送一个事件
- **logs** - 发送符合指定过滤条件的新增区块中的日志

当需要终止任何现有的 WebSocket 连接时，可以使用 **eth_unsubscribe** 调用并配合订阅 ID 参数。

### 何时使用 WebSocket，何时使用 webhook

选择使用 WebSocket 还是 webhook，取决于你的基础设施设计是更适合同时处理大量打开的 WebSocket 连接，还是更适合处理来自客户端的大量 webhook 连接请求。

如果你的服务器应用以云函数形式运行（如 AWS Lambda、Google Cloud Functions 等），请使用 webhook，因为该应用不会保持 WebSocket 连接打开。

如果需要发送的通知数量较少，webhook 也更具优势，因为连接只在事件发生时才建立。

如果事件很少发生，比起在客户端和服务器之间保持大量 WebSocket 连接打开，使用 webhook 更为合适。

最后，你是要在服务器与服务器之间建立桥接，还是在客户端与服务器之间建立桥接，这一点也很重要；前者更适合用 webhook，后者更适合用 WebSocket。我们创建了一个[用于搭建 webhook 服务器的 Github 仓库](https://github.com/alchemyplatform/webhook-examples)。

### 何时使用 WebSocket 协议

对于许多 Web3 应用来说，实时向用户更新其交易状态是必不可少的。否则，用户可能会有较差的使用体验，进而放弃你的应用或服务。Alchemy Notify 通过让用户准确了解其交易状态来解决这个问题。

#### 何时应使用 WebSocket 而非 HTTP

当延迟需要尽可能低，以便用户能尽快收到事件通知时，应使用 WebSocket 而非 HTTP 请求。相比之下，HTTP 要慢得多，因为客户端接收更新的频率受限于其发送请求的频率。

### WebSocket 示例

我们已经编写了指南，介绍如何实现 Alchemy Notify，为用户发送应用内通知，更新诸如钱包余额变动之类的关键事件状态。以下是我们已发布的一些教程：

1. [跟踪待处理和已挖出的 Ethereum 交易](https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum)
1. [构建具有实时交易通知功能的 dApp](https://www.alchemy.com/docs/reference/webhooks-overview)
1. [将 Alchemy webhook 与 Zapier 集成](https://www.alchemy.com/docs/reference/webhooks-overview)

[Alchemy Notify](https://www.alchemy.com/notify?a=e35dd0b6f1) 甚至可以用来向你的 dApp 用户发送邮件通知，避免用户对交易状态感到困惑或不满。
