[ PROMPT_NODE_24478 ]
常用模式
[ SKILL_DOCUMENTATION ]
# 常用模式
Cloudflare Workers 中 TCP 套接字的实际应用模式与示例。
typescript
import { connect } from 'cloudflare:sockets';
## 基础模式
### 简单的请求-响应
typescript
const socket = connect({ hostname: "echo.example.com", port: 7 }, { secureTransport: "on" });
try {
await socket.opened;
const writer = socket.writable.getWriter();
await writer.write(new TextEncoder().encode("Hellon"));
await writer.close();
const reader = socket.readable.getReader();
const { value } = await reader.read();
return new Response(value);
} finally {
await socket.close();
}
### 读取所有数据
typescript
async function readAll(socket: Socket): Promise {
const reader = socket.readable.getReader();
const chunks: Uint8Array[] = [];
while (true) {
const { done, value } = await reader.read();
if (done) break;
chunks.push(value);
}
const total = chunks.reduce((sum, c) => sum + c.length, 0);
const result = new Uint8Array(total);
let offset = 0;
for (const chunk of chunks) { result.set(chunk, offset); offset += chunk.length; }
return result;
}
### 流式响应
typescript
// 将套接字数据直接流式传输到 HTTP 响应
const socket = connect({ hostname: "stream.internal", port: 9000 }, { secureTransport: "on" });
const writer = socket.writable.getWriter();
await writer.write(new TextEncoder().encode("STREAMn"));
await writer.close();
return new Response(socket.readable);
## 协议示例
### Redis RESP
typescript
// 发送: *2rn$3rnGETrn$rnrn
// 接收: $rnrn 或 $-1rn 表示 null
const socket = connect({ hostname: "redis.internal", port: 6379 });
const writer = socket.writable.getWriter();
await writer.write(new TextEncoder().encode(`*2rn$3rnGETrn$3rnkeyrn`));
### PostgreSQL
**生产环境请使用 [Hyperdrive](../hyperdrive/)。** 原始 Postgres 协议非常复杂(涉及启动、认证、查询消息)。
### MQTT
typescript
const socket = connect({ hostname: "mqtt.broker", port: 1883 });
const writer = socket.writable.getWriter();
// CONNECT: 0x10 0x00 0x04 "MQTT" 0x04 ...
// PUBLISH: 0x30
## 错误处理模式
### 带退避的重试
typescript
async function connectWithRetry(addr: SocketAddress, opts: SocketOptions, maxRetries = 3): Promise {
for (let i = 1; i <= maxRetries; i++) {
try {
const socket = connect(ad