如何在Deno中检测远程端已关闭(中止)TCP/IP(HTTP)连接?
在Deno中检测远程TCP/HTTP连接关闭的替代方案
你尝试使用的conn.on('abort')事件API在Deno中并不存在,要检测远程连接是否关闭,需要通过捕获异步操作的错误或判断读取结果来实现,以下是两种可行方案:
1. HTTP场景下的连接关闭检测
在处理HTTP请求的流程中,当远程连接关闭时,读取请求体、发送响应或遍历httpConn迭代器的操作会抛出特定错误,通过捕获这些错误即可感知连接状态:
const server = Deno.listen({ port: 8080 }); for await (const conn of server) { // 用自执行异步函数处理单个连接,避免阻塞迭代 (async () => { const httpConn = Deno.serveHttp(conn); try { for await (const requestEvent of httpConn) { try { // 读取请求体,连接关闭时会触发错误 await requestEvent.request.text(); // 尝试发送响应,连接断开时也会抛出错误 await requestEvent.respondWith(new Response("OK", { status: 200 })); } catch (err) { // 匹配连接关闭相关的错误类型 if (err instanceof Deno.errors.BrokenPipe || err instanceof Deno.errors.ConnectionReset) { console.log("远程HTTP连接已关闭"); // 在这里执行连接关闭后的清理逻辑 } } } } catch (err) { if (err instanceof Deno.errors.ConnectionReset) { console.log("HTTP连接被远程重置"); } } finally { conn.close(); } })(); }
2. 纯TCP场景下的连接关闭检测
如果是直接处理TCP连接,可通过循环读取连接数据来判断:当连接正常关闭时,conn.read()会返回null;异常关闭时则会抛出ConnectionReset错误:
const server = Deno.listen({ port: 8080 }); for await (const conn of server) { (async () => { const buf = new Uint8Array(1024); try { while (true) { const readSize = await conn.read(buf); if (readSize === null) { console.log("远程TCP连接已正常关闭"); break; } // 处理读取到的TCP数据 const data = new TextDecoder().decode(buf.subarray(0, readSize)); console.log(`收到数据: ${data}`); } } catch (err) { if (err instanceof Deno.errors.ConnectionReset) { console.log("TCP连接被远程强制断开"); } } finally { conn.close(); } })(); }
关键说明
Deno的Conn对象没有提供事件监听式的连接关闭检测API,必须通过异步I/O操作的错误捕获或读取结果判断来实现连接状态的感知,上述两种方案分别覆盖了HTTP和纯TCP的常见场景。
内容的提问来源于stack exchange,提问作者Martin Ždila
相关产品推荐
相关产品推荐

