Node.js net.Socket.destroy()深入解析

socket.destroy() 是 Node.js net 模塊中用于強制銷毀 TCP 套接字的方法,比 socket.end() 更徹底。下面我將從多個方面全面講解這個方法。

基本用法

const net = require('net');const server = net.createServer((socket) => {// 強制銷毀套接字socket.destroy();
});server.listen(3000, () => {const client = net.createConnection({ port: 3000 }, () => {client.on('close', (hadError) => {console.log('連接關閉,是否有錯誤:', hadError);});// 嘗試寫入數據(會失敗,因為套接字已被銷毀)client.write('data', (err) => {console.log('寫入錯誤:', err); // 會觸發錯誤});});
});

方法簽名

socket.destroy(error?: Error): void;
  • 參數:可選的 Error 對象,如果提供,會觸發 'error' 事件
  • 返回值:無

socket.end() 的區別

特性destroy()end()
數據發送立即終止,不發送排隊數據嘗試發送完排隊數據后再關閉
事件觸發觸發 'close' 事件觸發 'finish' 后觸發 'close'
錯誤處理可傳遞錯誤對象不處理錯誤
資源釋放立即釋放等待數據發送完成

底層行為

  1. 立即終止連接

    • 發送 RST 包(而不是正常的 FIN 包)給對端
    • 立即釋放所有內部資源
  2. 事件觸發順序

    • 如果提供了錯誤對象,先觸發 'error' 事件
    • 然后觸發 'close' 事件,參數 hadErrortrue
  3. 流狀態

    • 將套接字標記為已銷毀
    • 所有后續 I/O 操作都會失敗

錯誤處理

const error = new Error('自定義銷毀錯誤');
socket.destroy(error);socket.on('error', (err) => {console.error('套接字錯誤:', err); // 會輸出自定義錯誤
});socket.on('close', (hadError) => {console.log('連接關閉,是否有錯誤:', hadError); // hadError 為 true
});

實際應用場景

  1. 處理協議錯誤

    socket.on('data', (data) => {if (!isValidProtocol(data)) {socket.destroy(new Error('無效協議'));}
    });
    
  2. 超時處理

    socket.setTimeout(5000);
    socket.on('timeout', () => {socket.destroy(new Error('連接超時'));
    });
    
  3. 資源清理

    function cleanup(socket) {if (!socket.destroyed) {socket.destroy();}// 其他清理工作...
    }
    

注意事項

  1. 多次調用

    • 多次調用 destroy() 是安全的,不會拋出錯誤
    • 只有第一次調用會實際執行銷毀操作
  2. 'end' 事件

    • 銷毀的套接字不會觸發 'end' 事件
    • 只觸發 'close' 事件
  3. 資源泄漏風險

    • 未銷毀的套接字可能導致資源泄漏
    • 在錯誤處理路徑中尤其要注意銷毀套接字
  4. HTTP 服務器

    • 在 HTTP 服務器中,通常使用 response.destroy() 而不是直接操作底層套接字

高級用法

1. 自定義銷毀行為

const originalDestroy = socket.destroy;
socket.destroy = function(err) {console.log('自定義銷毀邏輯');originalDestroy.call(this, err);
};

2. 延遲銷毀

function destroyAfter(socket, ms, error) {setTimeout(() => {if (!socket.destroyed) {socket.destroy(error);}}, ms);
}

3. 批量銷毀

function destroyAllSockets(sockets, error) {sockets.forEach(socket => {if (!socket.destroyed) {socket.destroy(error);}});
}

性能考慮

  1. 立即銷毀 vs 優雅關閉

    • destroy() 更高效,但可能丟失數據
    • end() 更安全,但可能延遲連接關閉
  2. 在高并發場景

    • 及時銷毀無用套接字可減少內存和文件描述符占用
    • 但要注意不要在數據傳輸過程中意外銷毀

調試技巧

  1. 監聽所有事件

    ['close', 'error', 'end', 'finish', 'drain'].forEach(event => {socket.on(event, () => {console.log(`事件 ${event} 觸發,destroyed: ${socket.destroyed}`);});
    });
    
  2. 檢查套接字狀態

    console.log({destroyed: socket.destroyed,closed: socket.closed,readable: socket.readable,writable: socket.writable
    });
    

常見問題解決

  1. 問題:調用 destroy() 后仍然收到數據

    • 原因:操作系統可能已經接收了數據但尚未傳遞給應用
    • 解決:在 'close' 事件中處理剩余數據
  2. 問題destroy() 導致未捕獲異常

    • 原因:沒有監聽 'error' 事件
    • 解決:始終添加錯誤處理
  3. 問題:文件描述符泄漏

    • 原因:未正確銷毀套接字
    • 解決:確保所有代碼路徑都調用 destroy()

總結

socket.destroy() 是 Node.js 網絡編程中用于強制終止連接的重要方法,適用于需要立即釋放資源的場景。理解它與 socket.end() 的區別、正確處理錯誤事件以及注意資源清理,是使用該方法的關鍵。在大多數情況下,推薦結合錯誤處理和適當的超時機制來使用此方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90007.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90007.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90007.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vmware 克隆虛擬機,報錯:克隆時出錯:指定不存在的設備。然后電腦卡死,只能強制關機再開機。

vmware 克隆虛擬機,報錯:克隆時出錯:指定不存在的設備。然后電腦卡死,只能強制關機再開機。1、問題描述2、問題原因3、解決方法1、問題描述 vmware 版本:vmware workstation pro 17.6.3 克隆虛擬機時,創建完整克隆&am…

如何使用Python將任意PPT變為“智能模板”(解決 python-pptx 替換元素無法保留格式的問題,陰影、填充等屬性保留!)

文章目錄 ?? 介紹 ?? ?? 演示環境 ?? ?? 深入 OpenXML:格式保留的終極武器 ?? ?? 如何打造你自己的“格式保留”PPT模板? ?? 為什么格式會丟失? ??? 方案一:圖片的“格式移植”大法 ??? 實現代碼 ?? 原理解析 ?? 方案二:文本的“外科手術”大法…

學習python中離線安裝pip及下載package的方法

正常而言,Python 3.4及以上版本默認自帶pip工具?,無需額外安裝,如果需要單獨離線安裝pip,可以先使用DeepSeek查看指定操作系統能安裝的最高pip版本,然后在參考文獻1中現在指定版本的pip離線安裝文件,通常為…

liunx運維進階腳本

一、文件與目錄操作1.快速創建目錄樹mkdir -p project/{src,doc,test/{unit,integration}}創建嵌套目錄結構,避免逐層創建。2查找并刪除7天前的日志文件find /var/log -name "*.log" -mtime 7 -exec rm -f {} \;結合find和exec實現定時清理。3.批量重命名…

Apache Ignite 中的 SQL 模式(Schema)管理機制

這段內容講的是 Apache Ignite 中的 SQL 模式(Schema)管理機制。我們可以從幾個方面來理解: 一、什么是 Schema(模式)? 在 SQL 中,Schema 是數據庫對象(如表、視圖等)的…

分布式光伏發電多合一(也稱為五合一或者群調群控)終端,從功能、市場前景等等方面介紹

對于當下分布式光伏從業者,多合一終端經常被提及到。而且很多地區也有正常使用,目前來看,使用效果也是比較好的,滿足當下的使用要求。并且價格也是可以接受。下面從幾個方面簡單介紹一下。功能介紹 5G通信功能 設備內置 5G通信模組…

AWE2026啟動:加碼AI科技,雙展區聯動開啟產業新格局

7月22日,由中國家用電器協會主辦的2026年中國家電及消費電子博覽會(AWE2026)啟動發布會在上海舉行。據「TMT星球」了解,AWE2026將以“AI科技、慧享未來”為主題,首次啟用“一展雙區”的新模式,于2026年3月1…

Django基礎(六)———數據庫

前言上篇文章給大家介紹了DTL模板結構這篇文章將講述Django框架與MySQL數據庫的綜合使用一、Django配置連接數據庫在操作數據庫之前,首先先要連接數據庫,這里我們以配置MySQL為例來講解。Diango連接數據庫,不需要單獨的創建一個連接對象。 只…

postgresql使用記錄 SCRAM authentication requires libpq version 10 or above

文章目錄 背景 如何用命令行連接數據庫 報錯 原因 解決方案 psql常見命令 ?? **核心數據庫操作命令** 1. **查看所有數據庫** 2. **切換數據庫** 3. **查看表及結構** 4. **執行 SQL 文件** 5. **退出 psql** ?? **高級管理命令** ? **注意事項** 背景 由于某種原因,無法…

2.0版本seata、nacos+ruoyi(微服務)配置

一、下載: seata下載:點擊這里 nacos下載:點擊這里 ruoyi(微服務)下載:點擊這里 Git bash下載:點擊這里 本文所用的版本: seata-2.2.0(下圖紅色框框)&a…

面試高頻題 力扣 LCR 130.衣柜整理 洪水灌溉(FloodFill) 深度優先遍歷(dfs) 暴力搜索 C++解題思路 每日一題

目錄零、題目描述一、為什么這道題值得一看?二、題目拆解:核心要素與約束三、算法實現:基于 DFS 的解決方案代碼邏輯拆解五、時間復雜度與空間復雜度時間復雜度空間復雜度六、坑點總結七、舉一反三八、洪水灌溉(Flood Fill&#x…

Ext4文件系統全景解析

目錄Ext4文件系統全景解析:從inode到數據恢復實戰1. Ext文件系統的"小區規劃":塊組結構詳解 🏘?1.1 塊組:文件系統的基本管理單元1.2 超級塊的"多重備份"機制 🛡?2. inode:文件的&qu…

貪心算法Day4學習心得

先來看第一道:860. 檸檬水找零 - 力扣(LeetCode) 有如下三種情況: 情況一:賬單是5,直接收下。情況二:賬單是10,消耗一個5,增加一個10情況三:賬單是20&#…

接口自動化測試種涉及到接口依賴怎么辦?

《接口自動化測試中接口依賴的處理方式及選擇原則》在接口自動化測試中,接口依賴是指某個接口的請求參數、執行條件或測試結果依賴于其他接口的輸出(如返回數據、狀態等)。處理接口依賴是確保測試用例準確性和穩定性的關鍵,常見的…

hive分區表臨時加載日批數據文件

源系統每日上傳一個csv數據文件到數據中臺指定目錄,數據中臺用hive表進行ETL工作。 先建一個外部分區表: create external table tmp_lease_contract ( contract_id string, vin string, amount float ) partitioned by (dt string) row format delim…

Python關于pandas的基礎知識

一.掃盲(一)、pandas 是什么pandas 是 Python 的一個第三方數據處理庫,它提供了高效、靈活的數據結構(如 Series 和 DataFrame),能方便地對結構化數據進行清洗、轉換、分析和處理。(二&#xff…

React 英語單詞補全游戲——一個寓教于樂的英語單詞記憶游戲

預覽:英語單詞補全 📖 產品概述 英語單詞大冒險是一款專為 7-12 歲兒童設計的互動式英語學習游戲。通過聽音頻、補全單詞的游戲方式,讓孩子在輕松愉快的環境中提升英語詞匯能力和聽力水平。 🎯 核心價值主張 寓教于樂: 將枯燥…

我的第一個開源項目 -- 實時語音識別工具

這是我的第一個開源項目,是我一直想做的一個小工具: 端到端實時語音轉文字系統。 通過小程序和H5頁面,用戶可以實時采錄音頻,通過ws上傳到java的netty server。 Java在經過權限驗證、流量控制等操作之后,通過gRPC流…

AG32 mcu+cpld 聯合編程(概念及流程)

在使用mcucpld聯合編程之前,請確認已經熟練掌握mcu的使用方法,并且對cpld編程(verilog語言)有一定的基礎。 另外,對AHB總線也需要有一定的了解。 這個章節分為兩部分: 第一部分,展示聯合編程…

Hadoop調度器深度解析:FairScheduler與CapacityScheduler的優化策略

Hadoop調度器概述在大數據處理的生態系統中,Hadoop作為分布式計算框架的核心,其資源調度機制直接決定了集群的吞吐效率和作業執行公平性。調度器作為Hadoop資源管理的中樞神經,通過協調計算資源與任務需求之間的動態平衡,成為支撐…