[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fhttp":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fhttp":3534,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fhttp":3560},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":14,"pinned":15,"draft":15,"body":16,"seo":3530,"stem":3531,"id":3532,"extension":3533},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fhttp","网络编程","Node.js 提供了丰富的内置模块，用于构建网络应用。下面从 HTTP\u002FHTTPS、WebSocket、TCP\u002FUDP 以及 DNS 解析四个方面进行深入介绍。","技能小册",[12,13],"nodejs","http","2023-01-27",false,{"type":17,"value":18,"toc":3519},"minimark",[19,22,27,30,35,45,54,312,334,338,345,507,512,602,605,619,629,639,1025,1032,1036,1060,1177,1193,1261,1295,1441,1449,1455,1458,1477,1481,1950,1954,2059,2062,2077,2081,2089,2094,2370,2375,2572,2579,2582,2587,2823,2828,3029,3040,3046,3137,3140,3392,3403,3406,3512,3515],[20,21,8],"h1",{"id":8},[23,24,26],"h2",{"id":25},"nodejs-网络编程详解","Node.js 网络编程详解",[28,29,9],"p",{},[31,32,34],"h3",{"id":33},"一httphttps","一、HTTP\u002FHTTPS",[28,36,37,40,41,44],{},[38,39,13],"code",{}," 和 ",[38,42,43],{},"https"," 模块是 Node.js 核心模块，用于创建 HTTP 服务器和客户端。",[46,47,49,50,53],"h4",{"id":48},"_1-创建服务器httpcreateserver","1. 创建服务器（",[38,51,52],{},"http.createServer","）",[55,56,61],"pre",{"className":57,"code":58,"language":59,"meta":60,"style":60},"language-js shiki shiki-themes material-theme-lighter github-light github-dark","const http = require(\"http\");\n\nconst server = http.createServer((req, res) => {\n    \u002F\u002F req: 请求对象，包含请求方法、URL、头部等\n    \u002F\u002F res: 响应对象，用于发送响应\n    res.writeHead(200, { \"Content-Type\": \"text\u002Fplain\" });\n    res.end(\"Hello World\\n\");\n});\n\nserver.listen(3000, () => {\n    console.log(\"Server running at http:\u002F\u002Flocalhost:3000\u002F\");\n});\n","js","",[38,62,63,104,111,151,158,164,213,239,249,254,279,303],{"__ignoreMap":60},[64,65,68,72,76,80,84,88,92,95,97,100],"span",{"class":66,"line":67},"line",1,[64,69,71],{"class":70},"sbsja","const",[64,73,75],{"class":74},"s_hVV"," http",[64,77,79],{"class":78},"smGrS"," =",[64,81,83],{"class":82},"sGLFI"," require",[64,85,87],{"class":86},"su5hD","(",[64,89,91],{"class":90},"sjJ54","\"",[64,93,13],{"class":94},"s_sjI",[64,96,91],{"class":90},[64,98,99],{"class":86},")",[64,101,103],{"class":102},"sP7_E",";\n",[64,105,107],{"class":66,"line":106},2,[64,108,110],{"emptyLinePlaceholder":109},true,"\n",[64,112,114,116,119,121,123,126,129,131,133,137,140,143,145,148],{"class":66,"line":113},3,[64,115,71],{"class":70},[64,117,118],{"class":74}," server",[64,120,79],{"class":78},[64,122,75],{"class":86},[64,124,125],{"class":102},".",[64,127,128],{"class":82},"createServer",[64,130,87],{"class":86},[64,132,87],{"class":102},[64,134,136],{"class":135},"s99_P","req",[64,138,139],{"class":102},",",[64,141,142],{"class":135}," res",[64,144,99],{"class":102},[64,146,147],{"class":70}," =>",[64,149,150],{"class":102}," {\n",[64,152,154],{"class":66,"line":153},4,[64,155,157],{"class":156},"sutJx","    \u002F\u002F req: 请求对象，包含请求方法、URL、头部等\n",[64,159,161],{"class":66,"line":160},5,[64,162,163],{"class":156},"    \u002F\u002F res: 响应对象，用于发送响应\n",[64,165,167,170,172,175,178,182,184,187,190,194,196,199,201,204,206,209,211],{"class":66,"line":166},6,[64,168,169],{"class":86},"    res",[64,171,125],{"class":102},[64,173,174],{"class":82},"writeHead",[64,176,87],{"class":177},"skxfh",[64,179,181],{"class":180},"srdBf","200",[64,183,139],{"class":102},[64,185,186],{"class":102}," {",[64,188,189],{"class":90}," \"",[64,191,193],{"class":192},"sZUrc","Content-Type",[64,195,91],{"class":90},[64,197,198],{"class":102},":",[64,200,189],{"class":90},[64,202,203],{"class":94},"text\u002Fplain",[64,205,91],{"class":90},[64,207,208],{"class":102}," }",[64,210,99],{"class":177},[64,212,103],{"class":102},[64,214,216,218,220,223,225,227,230,233,235,237],{"class":66,"line":215},7,[64,217,169],{"class":86},[64,219,125],{"class":102},[64,221,222],{"class":82},"end",[64,224,87],{"class":177},[64,226,91],{"class":90},[64,228,229],{"class":94},"Hello World",[64,231,232],{"class":74},"\\n",[64,234,91],{"class":90},[64,236,99],{"class":177},[64,238,103],{"class":102},[64,240,242,245,247],{"class":66,"line":241},8,[64,243,244],{"class":102},"}",[64,246,99],{"class":86},[64,248,103],{"class":102},[64,250,252],{"class":66,"line":251},9,[64,253,110],{"emptyLinePlaceholder":109},[64,255,257,260,262,265,267,270,272,275,277],{"class":66,"line":256},10,[64,258,259],{"class":86},"server",[64,261,125],{"class":102},[64,263,264],{"class":82},"listen",[64,266,87],{"class":86},[64,268,269],{"class":180},"3000",[64,271,139],{"class":102},[64,273,274],{"class":102}," ()",[64,276,147],{"class":70},[64,278,150],{"class":102},[64,280,282,285,287,290,292,294,297,299,301],{"class":66,"line":281},11,[64,283,284],{"class":86},"    console",[64,286,125],{"class":102},[64,288,289],{"class":82},"log",[64,291,87],{"class":177},[64,293,91],{"class":90},[64,295,296],{"class":94},"Server running at http:\u002F\u002Flocalhost:3000\u002F",[64,298,91],{"class":90},[64,300,99],{"class":177},[64,302,103],{"class":102},[64,304,306,308,310],{"class":66,"line":305},12,[64,307,244],{"class":102},[64,309,99],{"class":86},[64,311,103],{"class":102},[313,314,315,325],"ul",{},[316,317,318,320,321,324],"li",{},[38,319,136],{}," 是 ",[38,322,323],{},"http.IncomingMessage"," 实例，可读取请求行、头部、数据。",[316,326,327,320,330,333],{},[38,328,329],{},"res",[38,331,332],{},"http.ServerResponse"," 实例，用于设置状态码、头部并写入响应体。",[46,335,337],{"id":336},"_2-处理请求响应对象","2. 处理请求\u002F响应对象",[28,339,340,344],{},[341,342,343],"strong",{},"获取请求信息","：",[55,346,348],{"className":57,"code":347,"language":59,"meta":60,"style":60},"const { method, url, headers } = req;\nlet body = \"\";\nreq.on(\"data\", chunk => {\n    body += chunk.toString();\n});\nreq.on(\"end\", () => {\n    console.log(\"请求体:\", body);\n});\n",[38,349,350,378,394,421,441,449,473,499],{"__ignoreMap":60},[64,351,352,354,356,359,361,364,366,369,371,373,376],{"class":66,"line":67},[64,353,71],{"class":70},[64,355,186],{"class":102},[64,357,358],{"class":74}," method",[64,360,139],{"class":102},[64,362,363],{"class":74}," url",[64,365,139],{"class":102},[64,367,368],{"class":74}," headers",[64,370,208],{"class":102},[64,372,79],{"class":78},[64,374,375],{"class":86}," req",[64,377,103],{"class":102},[64,379,380,383,386,389,392],{"class":66,"line":106},[64,381,382],{"class":70},"let",[64,384,385],{"class":86}," body ",[64,387,388],{"class":78},"=",[64,390,391],{"class":90}," \"\"",[64,393,103],{"class":102},[64,395,396,398,400,403,405,407,410,412,414,417,419],{"class":66,"line":113},[64,397,136],{"class":86},[64,399,125],{"class":102},[64,401,402],{"class":82},"on",[64,404,87],{"class":86},[64,406,91],{"class":90},[64,408,409],{"class":94},"data",[64,411,91],{"class":90},[64,413,139],{"class":102},[64,415,416],{"class":135}," chunk",[64,418,147],{"class":70},[64,420,150],{"class":102},[64,422,423,426,429,431,433,436,439],{"class":66,"line":153},[64,424,425],{"class":86},"    body",[64,427,428],{"class":78}," +=",[64,430,416],{"class":86},[64,432,125],{"class":102},[64,434,435],{"class":82},"toString",[64,437,438],{"class":177},"()",[64,440,103],{"class":102},[64,442,443,445,447],{"class":66,"line":160},[64,444,244],{"class":102},[64,446,99],{"class":86},[64,448,103],{"class":102},[64,450,451,453,455,457,459,461,463,465,467,469,471],{"class":66,"line":166},[64,452,136],{"class":86},[64,454,125],{"class":102},[64,456,402],{"class":82},[64,458,87],{"class":86},[64,460,91],{"class":90},[64,462,222],{"class":94},[64,464,91],{"class":90},[64,466,139],{"class":102},[64,468,274],{"class":102},[64,470,147],{"class":70},[64,472,150],{"class":102},[64,474,475,477,479,481,483,485,488,490,492,495,497],{"class":66,"line":215},[64,476,284],{"class":86},[64,478,125],{"class":102},[64,480,289],{"class":82},[64,482,87],{"class":177},[64,484,91],{"class":90},[64,486,487],{"class":94},"请求体:",[64,489,91],{"class":90},[64,491,139],{"class":102},[64,493,494],{"class":86}," body",[64,496,99],{"class":177},[64,498,103],{"class":102},[64,500,501,503,505],{"class":66,"line":241},[64,502,244],{"class":102},[64,504,99],{"class":86},[64,506,103],{"class":102},[28,508,509,344],{},[341,510,511],{},"设置响应",[55,513,515],{"className":57,"code":514,"language":59,"meta":60,"style":60},"res.statusCode = 404;\nres.setHeader(\"X-Custom\", \"MyValue\");\nres.write(\"Partial content\");\nres.end(); \u002F\u002F 结束响应\n",[38,516,517,533,564,586],{"__ignoreMap":60},[64,518,519,521,523,526,528,531],{"class":66,"line":67},[64,520,329],{"class":86},[64,522,125],{"class":102},[64,524,525],{"class":86},"statusCode ",[64,527,388],{"class":78},[64,529,530],{"class":180}," 404",[64,532,103],{"class":102},[64,534,535,537,539,542,544,546,549,551,553,555,558,560,562],{"class":66,"line":106},[64,536,329],{"class":86},[64,538,125],{"class":102},[64,540,541],{"class":82},"setHeader",[64,543,87],{"class":86},[64,545,91],{"class":90},[64,547,548],{"class":94},"X-Custom",[64,550,91],{"class":90},[64,552,139],{"class":102},[64,554,189],{"class":90},[64,556,557],{"class":94},"MyValue",[64,559,91],{"class":90},[64,561,99],{"class":86},[64,563,103],{"class":102},[64,565,566,568,570,573,575,577,580,582,584],{"class":66,"line":113},[64,567,329],{"class":86},[64,569,125],{"class":102},[64,571,572],{"class":82},"write",[64,574,87],{"class":86},[64,576,91],{"class":90},[64,578,579],{"class":94},"Partial content",[64,581,91],{"class":90},[64,583,99],{"class":86},[64,585,103],{"class":102},[64,587,588,590,592,594,596,599],{"class":66,"line":153},[64,589,329],{"class":86},[64,591,125],{"class":102},[64,593,222],{"class":82},[64,595,438],{"class":86},[64,597,598],{"class":102},";",[64,600,601],{"class":156}," \u002F\u002F 结束响应\n",[28,603,604],{},"常用便捷方法：",[313,606,607,613],{},[316,608,609,612],{},[38,610,611],{},"res.writeHead(statusCode, statusMessage, headers)","：同时设置状态码和头部。",[316,614,615,618],{},[38,616,617],{},"res.end([data])","：结束响应，可选最后发送数据。",[28,620,621,624,625,628],{},[341,622,623],{},"解析请求体","：对于 JSON 或表单数据，可使用中间件或手动解析。也可借助 ",[38,626,627],{},"express"," 等框架。",[46,630,632,633,40,636,53],{"id":631},"_3-创建客户端请求httprequest-和-httpget","3. 创建客户端请求（",[38,634,635],{},"http.request",[38,637,638],{},"http.get",[55,640,642],{"className":57,"code":641,"language":59,"meta":60,"style":60},"const http = require(\"http\");\n\n\u002F\u002F 使用 http.request\nconst req = http.request(\n    {\n        hostname: \"example.com\",\n        port: 80,\n        path: \"\u002F\",\n        method: \"GET\",\n        headers: { Accept: \"application\u002Fjson\" },\n    },\n    res => {\n        console.log(`状态码: ${res.statusCode}`);\n        res.setEncoding(\"utf8\");\n        res.on(\"data\", chunk => {\n            console.log(chunk);\n        });\n    }\n);\nreq.on(\"error\", e => console.error(e));\nreq.end();\n\n\u002F\u002F 简化 GET: http.get\nhttp.get(\"http:\u002F\u002Fexample.com\", res => {\n    \u002F* ... *\u002F\n});\n",[38,643,644,666,670,675,693,698,715,727,743,759,783,788,796,831,855,880,899,909,915,922,959,972,977,983,1010,1016],{"__ignoreMap":60},[64,645,646,648,650,652,654,656,658,660,662,664],{"class":66,"line":67},[64,647,71],{"class":70},[64,649,75],{"class":74},[64,651,79],{"class":78},[64,653,83],{"class":82},[64,655,87],{"class":86},[64,657,91],{"class":90},[64,659,13],{"class":94},[64,661,91],{"class":90},[64,663,99],{"class":86},[64,665,103],{"class":102},[64,667,668],{"class":66,"line":106},[64,669,110],{"emptyLinePlaceholder":109},[64,671,672],{"class":66,"line":113},[64,673,674],{"class":156},"\u002F\u002F 使用 http.request\n",[64,676,677,679,681,683,685,687,690],{"class":66,"line":153},[64,678,71],{"class":70},[64,680,375],{"class":74},[64,682,79],{"class":78},[64,684,75],{"class":86},[64,686,125],{"class":102},[64,688,689],{"class":82},"request",[64,691,692],{"class":86},"(\n",[64,694,695],{"class":66,"line":160},[64,696,697],{"class":102},"    {\n",[64,699,700,703,705,707,710,712],{"class":66,"line":166},[64,701,702],{"class":177},"        hostname",[64,704,198],{"class":102},[64,706,189],{"class":90},[64,708,709],{"class":94},"example.com",[64,711,91],{"class":90},[64,713,714],{"class":102},",\n",[64,716,717,720,722,725],{"class":66,"line":215},[64,718,719],{"class":177},"        port",[64,721,198],{"class":102},[64,723,724],{"class":180}," 80",[64,726,714],{"class":102},[64,728,729,732,734,736,739,741],{"class":66,"line":241},[64,730,731],{"class":177},"        path",[64,733,198],{"class":102},[64,735,189],{"class":90},[64,737,738],{"class":94},"\u002F",[64,740,91],{"class":90},[64,742,714],{"class":102},[64,744,745,748,750,752,755,757],{"class":66,"line":251},[64,746,747],{"class":177},"        method",[64,749,198],{"class":102},[64,751,189],{"class":90},[64,753,754],{"class":94},"GET",[64,756,91],{"class":90},[64,758,714],{"class":102},[64,760,761,764,766,768,771,773,775,778,780],{"class":66,"line":256},[64,762,763],{"class":177},"        headers",[64,765,198],{"class":102},[64,767,186],{"class":102},[64,769,770],{"class":177}," Accept",[64,772,198],{"class":102},[64,774,189],{"class":90},[64,776,777],{"class":94},"application\u002Fjson",[64,779,91],{"class":90},[64,781,782],{"class":102}," },\n",[64,784,785],{"class":66,"line":281},[64,786,787],{"class":102},"    },\n",[64,789,790,792,794],{"class":66,"line":305},[64,791,169],{"class":135},[64,793,147],{"class":70},[64,795,150],{"class":102},[64,797,799,802,804,806,808,811,814,817,819,821,824,827,829],{"class":66,"line":798},13,[64,800,801],{"class":86},"        console",[64,803,125],{"class":102},[64,805,289],{"class":82},[64,807,87],{"class":177},[64,809,810],{"class":90},"`",[64,812,813],{"class":94},"状态码: ",[64,815,816],{"class":90},"${",[64,818,329],{"class":86},[64,820,125],{"class":90},[64,822,823],{"class":86},"statusCode",[64,825,826],{"class":90},"}`",[64,828,99],{"class":177},[64,830,103],{"class":102},[64,832,834,837,839,842,844,846,849,851,853],{"class":66,"line":833},14,[64,835,836],{"class":86},"        res",[64,838,125],{"class":102},[64,840,841],{"class":82},"setEncoding",[64,843,87],{"class":177},[64,845,91],{"class":90},[64,847,848],{"class":94},"utf8",[64,850,91],{"class":90},[64,852,99],{"class":177},[64,854,103],{"class":102},[64,856,858,860,862,864,866,868,870,872,874,876,878],{"class":66,"line":857},15,[64,859,836],{"class":86},[64,861,125],{"class":102},[64,863,402],{"class":82},[64,865,87],{"class":177},[64,867,91],{"class":90},[64,869,409],{"class":94},[64,871,91],{"class":90},[64,873,139],{"class":102},[64,875,416],{"class":135},[64,877,147],{"class":70},[64,879,150],{"class":102},[64,881,883,886,888,890,892,895,897],{"class":66,"line":882},16,[64,884,885],{"class":86},"            console",[64,887,125],{"class":102},[64,889,289],{"class":82},[64,891,87],{"class":177},[64,893,894],{"class":86},"chunk",[64,896,99],{"class":177},[64,898,103],{"class":102},[64,900,902,905,907],{"class":66,"line":901},17,[64,903,904],{"class":102},"        }",[64,906,99],{"class":177},[64,908,103],{"class":102},[64,910,912],{"class":66,"line":911},18,[64,913,914],{"class":102},"    }\n",[64,916,918,920],{"class":66,"line":917},19,[64,919,99],{"class":86},[64,921,103],{"class":102},[64,923,925,927,929,931,933,935,938,940,942,945,947,950,952,954,957],{"class":66,"line":924},20,[64,926,136],{"class":86},[64,928,125],{"class":102},[64,930,402],{"class":82},[64,932,87],{"class":86},[64,934,91],{"class":90},[64,936,937],{"class":94},"error",[64,939,91],{"class":90},[64,941,139],{"class":102},[64,943,944],{"class":135}," e",[64,946,147],{"class":70},[64,948,949],{"class":86}," console",[64,951,125],{"class":102},[64,953,937],{"class":82},[64,955,956],{"class":86},"(e))",[64,958,103],{"class":102},[64,960,962,964,966,968,970],{"class":66,"line":961},21,[64,963,136],{"class":86},[64,965,125],{"class":102},[64,967,222],{"class":82},[64,969,438],{"class":86},[64,971,103],{"class":102},[64,973,975],{"class":66,"line":974},22,[64,976,110],{"emptyLinePlaceholder":109},[64,978,980],{"class":66,"line":979},23,[64,981,982],{"class":156},"\u002F\u002F 简化 GET: http.get\n",[64,984,986,988,990,993,995,997,1000,1002,1004,1006,1008],{"class":66,"line":985},24,[64,987,13],{"class":86},[64,989,125],{"class":102},[64,991,992],{"class":82},"get",[64,994,87],{"class":86},[64,996,91],{"class":90},[64,998,999],{"class":94},"http:\u002F\u002Fexample.com",[64,1001,91],{"class":90},[64,1003,139],{"class":102},[64,1005,142],{"class":135},[64,1007,147],{"class":70},[64,1009,150],{"class":102},[64,1011,1013],{"class":66,"line":1012},25,[64,1014,1015],{"class":156},"    \u002F* ... *\u002F\n",[64,1017,1019,1021,1023],{"class":66,"line":1018},26,[64,1020,244],{"class":102},[64,1022,99],{"class":86},[64,1024,103],{"class":102},[28,1026,1027,1028,1031],{},"对于 HTTPS，使用 ",[38,1029,1030],{},"https.request","，默认端口 443。",[46,1033,1035],{"id":1034},"_4-代理keep-alive超时设置","4. 代理、Keep-Alive、超时设置",[313,1037,1038],{},[316,1039,1040,1043,1044,1047,1048,1051,1052,1055,1056,1059],{},[341,1041,1042],{},"代理","：可设置 ",[38,1045,1046],{},"agent"," 选项自定义 HTTP 代理。例如使用 ",[38,1049,1050],{},"http.Agent"," 管理连接池，或使用 ",[38,1053,1054],{},"globalAgent","。也可通过 ",[38,1057,1058],{},"HttpsProxyAgent"," 实现代理转发。",[55,1061,1063],{"className":57,"code":1062,"language":59,"meta":60,"style":60},"const { Agent } = require(\"http\");\nconst agent = new Agent({ keepAlive: true, maxSockets: 10 });\nconst req = http.request({ host: \"...\", agent });\n",[38,1064,1065,1092,1136],{"__ignoreMap":60},[64,1066,1067,1069,1071,1074,1076,1078,1080,1082,1084,1086,1088,1090],{"class":66,"line":67},[64,1068,71],{"class":70},[64,1070,186],{"class":102},[64,1072,1073],{"class":74}," Agent",[64,1075,208],{"class":102},[64,1077,79],{"class":78},[64,1079,83],{"class":82},[64,1081,87],{"class":86},[64,1083,91],{"class":90},[64,1085,13],{"class":94},[64,1087,91],{"class":90},[64,1089,99],{"class":86},[64,1091,103],{"class":102},[64,1093,1094,1096,1099,1101,1104,1106,1108,1111,1114,1116,1120,1122,1125,1127,1130,1132,1134],{"class":66,"line":106},[64,1095,71],{"class":70},[64,1097,1098],{"class":74}," agent",[64,1100,79],{"class":78},[64,1102,1103],{"class":78}," new",[64,1105,1073],{"class":82},[64,1107,87],{"class":86},[64,1109,1110],{"class":102},"{",[64,1112,1113],{"class":177}," keepAlive",[64,1115,198],{"class":102},[64,1117,1119],{"class":1118},"syTEX"," true",[64,1121,139],{"class":102},[64,1123,1124],{"class":177}," maxSockets",[64,1126,198],{"class":102},[64,1128,1129],{"class":180}," 10",[64,1131,208],{"class":102},[64,1133,99],{"class":86},[64,1135,103],{"class":102},[64,1137,1138,1140,1142,1144,1146,1148,1150,1152,1154,1157,1159,1161,1164,1166,1168,1171,1173,1175],{"class":66,"line":113},[64,1139,71],{"class":70},[64,1141,375],{"class":74},[64,1143,79],{"class":78},[64,1145,75],{"class":86},[64,1147,125],{"class":102},[64,1149,689],{"class":82},[64,1151,87],{"class":86},[64,1153,1110],{"class":102},[64,1155,1156],{"class":177}," host",[64,1158,198],{"class":102},[64,1160,189],{"class":90},[64,1162,1163],{"class":94},"...",[64,1165,91],{"class":90},[64,1167,139],{"class":102},[64,1169,1170],{"class":86}," agent ",[64,1172,244],{"class":102},[64,1174,99],{"class":86},[64,1176,103],{"class":102},[313,1178,1179],{},[316,1180,1181,1184,1185,1188,1189,1192],{},[341,1182,1183],{},"Keep-Alive","：默认 ",[38,1186,1187],{},"agent.keepAlive"," 为 ",[38,1190,1191],{},"false","，需手动开启：",[55,1194,1196],{"className":57,"code":1195,"language":59,"meta":60,"style":60},"const keepAliveAgent = new http.Agent({ keepAlive: true });\nhttp.request({ agent: keepAliveAgent, ... });\n",[38,1197,1198,1232],{"__ignoreMap":60},[64,1199,1200,1202,1205,1207,1209,1211,1213,1216,1218,1220,1222,1224,1226,1228,1230],{"class":66,"line":67},[64,1201,71],{"class":70},[64,1203,1204],{"class":74}," keepAliveAgent",[64,1206,79],{"class":78},[64,1208,1103],{"class":78},[64,1210,75],{"class":86},[64,1212,125],{"class":102},[64,1214,1215],{"class":82},"Agent",[64,1217,87],{"class":86},[64,1219,1110],{"class":102},[64,1221,1113],{"class":177},[64,1223,198],{"class":102},[64,1225,1119],{"class":1118},[64,1227,208],{"class":102},[64,1229,99],{"class":86},[64,1231,103],{"class":102},[64,1233,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1255,1257,1259],{"class":66,"line":106},[64,1235,13],{"class":86},[64,1237,125],{"class":102},[64,1239,689],{"class":82},[64,1241,87],{"class":86},[64,1243,1110],{"class":102},[64,1245,1098],{"class":177},[64,1247,198],{"class":102},[64,1249,1204],{"class":86},[64,1251,139],{"class":102},[64,1253,1254],{"class":78}," ...",[64,1256,208],{"class":102},[64,1258,99],{"class":86},[64,1260,103],{"class":102},[313,1262,1263],{},[316,1264,1265,1268,1269],{},[341,1266,1267],{},"超时设置","：\n",[313,1270,1271,1282],{},[316,1272,1273,1274,1277,1278,1281],{},"服务器端：",[38,1275,1276],{},"server.setTimeout(timeout, callback)"," 或 ",[38,1279,1280],{},"req.setTimeout(timeout, callback)","。",[316,1283,1284,1285,1287,1288,1291,1292,1294],{},"客户端：",[38,1286,1280],{}," 或设置 ",[38,1289,1290],{},"timeout"," 选项（",[38,1293,689],{}," 的 options 中）。",[55,1296,1298],{"className":57,"code":1297,"language":59,"meta":60,"style":60},"\u002F\u002F 服务器超时\nserver.setTimeout(5000, socket => {\n    console.log(\"请求超时\");\n    socket.destroy();\n});\n\n\u002F\u002F 客户端超时\nreq.setTimeout(3000, () => {\n    req.destroy();\n    console.error(\"请求超时\");\n});\n",[38,1299,1300,1305,1328,1349,1363,1371,1375,1380,1400,1413,1433],{"__ignoreMap":60},[64,1301,1302],{"class":66,"line":67},[64,1303,1304],{"class":156},"\u002F\u002F 服务器超时\n",[64,1306,1307,1309,1311,1314,1316,1319,1321,1324,1326],{"class":66,"line":106},[64,1308,259],{"class":86},[64,1310,125],{"class":102},[64,1312,1313],{"class":82},"setTimeout",[64,1315,87],{"class":86},[64,1317,1318],{"class":180},"5000",[64,1320,139],{"class":102},[64,1322,1323],{"class":135}," socket",[64,1325,147],{"class":70},[64,1327,150],{"class":102},[64,1329,1330,1332,1334,1336,1338,1340,1343,1345,1347],{"class":66,"line":113},[64,1331,284],{"class":86},[64,1333,125],{"class":102},[64,1335,289],{"class":82},[64,1337,87],{"class":177},[64,1339,91],{"class":90},[64,1341,1342],{"class":94},"请求超时",[64,1344,91],{"class":90},[64,1346,99],{"class":177},[64,1348,103],{"class":102},[64,1350,1351,1354,1356,1359,1361],{"class":66,"line":153},[64,1352,1353],{"class":86},"    socket",[64,1355,125],{"class":102},[64,1357,1358],{"class":82},"destroy",[64,1360,438],{"class":177},[64,1362,103],{"class":102},[64,1364,1365,1367,1369],{"class":66,"line":160},[64,1366,244],{"class":102},[64,1368,99],{"class":86},[64,1370,103],{"class":102},[64,1372,1373],{"class":66,"line":166},[64,1374,110],{"emptyLinePlaceholder":109},[64,1376,1377],{"class":66,"line":215},[64,1378,1379],{"class":156},"\u002F\u002F 客户端超时\n",[64,1381,1382,1384,1386,1388,1390,1392,1394,1396,1398],{"class":66,"line":241},[64,1383,136],{"class":86},[64,1385,125],{"class":102},[64,1387,1313],{"class":82},[64,1389,87],{"class":86},[64,1391,269],{"class":180},[64,1393,139],{"class":102},[64,1395,274],{"class":102},[64,1397,147],{"class":70},[64,1399,150],{"class":102},[64,1401,1402,1405,1407,1409,1411],{"class":66,"line":251},[64,1403,1404],{"class":86},"    req",[64,1406,125],{"class":102},[64,1408,1358],{"class":82},[64,1410,438],{"class":177},[64,1412,103],{"class":102},[64,1414,1415,1417,1419,1421,1423,1425,1427,1429,1431],{"class":66,"line":256},[64,1416,284],{"class":86},[64,1418,125],{"class":102},[64,1420,937],{"class":82},[64,1422,87],{"class":177},[64,1424,91],{"class":90},[64,1426,1342],{"class":94},[64,1428,91],{"class":90},[64,1430,99],{"class":177},[64,1432,103],{"class":102},[64,1434,1435,1437,1439],{"class":66,"line":281},[64,1436,244],{"class":102},[64,1438,99],{"class":86},[64,1440,103],{"class":102},[31,1442,1444,1445,1448],{"id":1443},"二websocketws-库集成与简单聊天","二、WebSocket：",[38,1446,1447],{},"ws"," 库集成与简单聊天",[28,1450,1451,1452,1454],{},"WebSocket 实现了全双工通信，适合实时应用。",[38,1453,1447],{}," 是 Node.js 中流行的 WebSocket 库。",[46,1456,1457],{"id":1457},"安装",[55,1459,1463],{"className":1460,"code":1461,"language":1462,"meta":60,"style":60},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","npm install ws\n","bash",[38,1464,1465],{"__ignoreMap":60},[64,1466,1467,1471,1474],{"class":66,"line":67},[64,1468,1470],{"class":1469},"sbgvK","npm",[64,1472,1473],{"class":94}," install",[64,1475,1476],{"class":94}," ws\n",[46,1478,1480],{"id":1479},"服务器端与-http-服务器共享端口","服务器端（与 HTTP 服务器共享端口）",[55,1482,1484],{"className":57,"code":1483,"language":59,"meta":60,"style":60},"const http = require(\"http\");\nconst WebSocket = require(\"ws\");\n\nconst server = http.createServer((req, res) => {\n    if (req.url === \"\u002F\" && req.method === \"GET\") {\n        res.end(\"WebSocket server running\");\n    }\n});\n\nconst wss = new WebSocket.Server({ server });\n\nwss.on(\"connection\", (ws, req) => {\n    console.log(\"客户端连接\");\n    ws.on(\"message\", message => {\n        console.log(\"收到: %s\", message);\n        \u002F\u002F 广播给所有客户端\n        wss.clients.forEach(client => {\n            if (client !== ws && client.readyState === WebSocket.OPEN) {\n                client.send(message);\n            }\n        });\n    });\n    ws.send(\"欢迎加入聊天室\");\n});\n\nserver.listen(8080);\n",[38,1485,1486,1508,1531,1535,1565,1614,1635,1639,1647,1651,1682,1686,1720,1741,1768,1793,1798,1822,1860,1878,1883,1891,1900,1921,1929,1933],{"__ignoreMap":60},[64,1487,1488,1490,1492,1494,1496,1498,1500,1502,1504,1506],{"class":66,"line":67},[64,1489,71],{"class":70},[64,1491,75],{"class":74},[64,1493,79],{"class":78},[64,1495,83],{"class":82},[64,1497,87],{"class":86},[64,1499,91],{"class":90},[64,1501,13],{"class":94},[64,1503,91],{"class":90},[64,1505,99],{"class":86},[64,1507,103],{"class":102},[64,1509,1510,1512,1515,1517,1519,1521,1523,1525,1527,1529],{"class":66,"line":106},[64,1511,71],{"class":70},[64,1513,1514],{"class":74}," WebSocket",[64,1516,79],{"class":78},[64,1518,83],{"class":82},[64,1520,87],{"class":86},[64,1522,91],{"class":90},[64,1524,1447],{"class":94},[64,1526,91],{"class":90},[64,1528,99],{"class":86},[64,1530,103],{"class":102},[64,1532,1533],{"class":66,"line":113},[64,1534,110],{"emptyLinePlaceholder":109},[64,1536,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555,1557,1559,1561,1563],{"class":66,"line":153},[64,1538,71],{"class":70},[64,1540,118],{"class":74},[64,1542,79],{"class":78},[64,1544,75],{"class":86},[64,1546,125],{"class":102},[64,1548,128],{"class":82},[64,1550,87],{"class":86},[64,1552,87],{"class":102},[64,1554,136],{"class":135},[64,1556,139],{"class":102},[64,1558,142],{"class":135},[64,1560,99],{"class":102},[64,1562,147],{"class":70},[64,1564,150],{"class":102},[64,1566,1567,1571,1574,1576,1578,1581,1584,1586,1588,1590,1593,1595,1597,1600,1602,1604,1606,1608,1611],{"class":66,"line":160},[64,1568,1570],{"class":1569},"sVHd0","    if",[64,1572,1573],{"class":177}," (",[64,1575,136],{"class":86},[64,1577,125],{"class":102},[64,1579,1580],{"class":86},"url",[64,1582,1583],{"class":78}," ===",[64,1585,189],{"class":90},[64,1587,738],{"class":94},[64,1589,91],{"class":90},[64,1591,1592],{"class":78}," &&",[64,1594,375],{"class":86},[64,1596,125],{"class":102},[64,1598,1599],{"class":86},"method",[64,1601,1583],{"class":78},[64,1603,189],{"class":90},[64,1605,754],{"class":94},[64,1607,91],{"class":90},[64,1609,1610],{"class":177},") ",[64,1612,1613],{"class":102},"{\n",[64,1615,1616,1618,1620,1622,1624,1626,1629,1631,1633],{"class":66,"line":166},[64,1617,836],{"class":86},[64,1619,125],{"class":102},[64,1621,222],{"class":82},[64,1623,87],{"class":177},[64,1625,91],{"class":90},[64,1627,1628],{"class":94},"WebSocket server running",[64,1630,91],{"class":90},[64,1632,99],{"class":177},[64,1634,103],{"class":102},[64,1636,1637],{"class":66,"line":215},[64,1638,914],{"class":102},[64,1640,1641,1643,1645],{"class":66,"line":241},[64,1642,244],{"class":102},[64,1644,99],{"class":86},[64,1646,103],{"class":102},[64,1648,1649],{"class":66,"line":251},[64,1650,110],{"emptyLinePlaceholder":109},[64,1652,1653,1655,1658,1660,1662,1664,1666,1669,1671,1673,1676,1678,1680],{"class":66,"line":256},[64,1654,71],{"class":70},[64,1656,1657],{"class":74}," wss",[64,1659,79],{"class":78},[64,1661,1103],{"class":78},[64,1663,1514],{"class":86},[64,1665,125],{"class":102},[64,1667,1668],{"class":82},"Server",[64,1670,87],{"class":86},[64,1672,1110],{"class":102},[64,1674,1675],{"class":86}," server ",[64,1677,244],{"class":102},[64,1679,99],{"class":86},[64,1681,103],{"class":102},[64,1683,1684],{"class":66,"line":281},[64,1685,110],{"emptyLinePlaceholder":109},[64,1687,1688,1691,1693,1695,1697,1699,1702,1704,1706,1708,1710,1712,1714,1716,1718],{"class":66,"line":305},[64,1689,1690],{"class":86},"wss",[64,1692,125],{"class":102},[64,1694,402],{"class":82},[64,1696,87],{"class":86},[64,1698,91],{"class":90},[64,1700,1701],{"class":94},"connection",[64,1703,91],{"class":90},[64,1705,139],{"class":102},[64,1707,1573],{"class":102},[64,1709,1447],{"class":135},[64,1711,139],{"class":102},[64,1713,375],{"class":135},[64,1715,99],{"class":102},[64,1717,147],{"class":70},[64,1719,150],{"class":102},[64,1721,1722,1724,1726,1728,1730,1732,1735,1737,1739],{"class":66,"line":798},[64,1723,284],{"class":86},[64,1725,125],{"class":102},[64,1727,289],{"class":82},[64,1729,87],{"class":177},[64,1731,91],{"class":90},[64,1733,1734],{"class":94},"客户端连接",[64,1736,91],{"class":90},[64,1738,99],{"class":177},[64,1740,103],{"class":102},[64,1742,1743,1746,1748,1750,1752,1754,1757,1759,1761,1764,1766],{"class":66,"line":833},[64,1744,1745],{"class":86},"    ws",[64,1747,125],{"class":102},[64,1749,402],{"class":82},[64,1751,87],{"class":177},[64,1753,91],{"class":90},[64,1755,1756],{"class":94},"message",[64,1758,91],{"class":90},[64,1760,139],{"class":102},[64,1762,1763],{"class":135}," message",[64,1765,147],{"class":70},[64,1767,150],{"class":102},[64,1769,1770,1772,1774,1776,1778,1780,1783,1785,1787,1789,1791],{"class":66,"line":857},[64,1771,801],{"class":86},[64,1773,125],{"class":102},[64,1775,289],{"class":82},[64,1777,87],{"class":177},[64,1779,91],{"class":90},[64,1781,1782],{"class":94},"收到: %s",[64,1784,91],{"class":90},[64,1786,139],{"class":102},[64,1788,1763],{"class":86},[64,1790,99],{"class":177},[64,1792,103],{"class":102},[64,1794,1795],{"class":66,"line":882},[64,1796,1797],{"class":156},"        \u002F\u002F 广播给所有客户端\n",[64,1799,1800,1803,1805,1808,1810,1813,1815,1818,1820],{"class":66,"line":901},[64,1801,1802],{"class":86},"        wss",[64,1804,125],{"class":102},[64,1806,1807],{"class":86},"clients",[64,1809,125],{"class":102},[64,1811,1812],{"class":82},"forEach",[64,1814,87],{"class":177},[64,1816,1817],{"class":135},"client",[64,1819,147],{"class":70},[64,1821,150],{"class":102},[64,1823,1824,1827,1829,1831,1834,1837,1839,1842,1844,1847,1849,1851,1853,1856,1858],{"class":66,"line":911},[64,1825,1826],{"class":1569},"            if",[64,1828,1573],{"class":177},[64,1830,1817],{"class":86},[64,1832,1833],{"class":78}," !==",[64,1835,1836],{"class":86}," ws",[64,1838,1592],{"class":78},[64,1840,1841],{"class":86}," client",[64,1843,125],{"class":102},[64,1845,1846],{"class":86},"readyState",[64,1848,1583],{"class":78},[64,1850,1514],{"class":86},[64,1852,125],{"class":102},[64,1854,1855],{"class":74},"OPEN",[64,1857,1610],{"class":177},[64,1859,1613],{"class":102},[64,1861,1862,1865,1867,1870,1872,1874,1876],{"class":66,"line":917},[64,1863,1864],{"class":86},"                client",[64,1866,125],{"class":102},[64,1868,1869],{"class":82},"send",[64,1871,87],{"class":177},[64,1873,1756],{"class":86},[64,1875,99],{"class":177},[64,1877,103],{"class":102},[64,1879,1880],{"class":66,"line":924},[64,1881,1882],{"class":102},"            }\n",[64,1884,1885,1887,1889],{"class":66,"line":961},[64,1886,904],{"class":102},[64,1888,99],{"class":177},[64,1890,103],{"class":102},[64,1892,1893,1896,1898],{"class":66,"line":974},[64,1894,1895],{"class":102},"    }",[64,1897,99],{"class":177},[64,1899,103],{"class":102},[64,1901,1902,1904,1906,1908,1910,1912,1915,1917,1919],{"class":66,"line":979},[64,1903,1745],{"class":86},[64,1905,125],{"class":102},[64,1907,1869],{"class":82},[64,1909,87],{"class":177},[64,1911,91],{"class":90},[64,1913,1914],{"class":94},"欢迎加入聊天室",[64,1916,91],{"class":90},[64,1918,99],{"class":177},[64,1920,103],{"class":102},[64,1922,1923,1925,1927],{"class":66,"line":985},[64,1924,244],{"class":102},[64,1926,99],{"class":86},[64,1928,103],{"class":102},[64,1930,1931],{"class":66,"line":1012},[64,1932,110],{"emptyLinePlaceholder":109},[64,1934,1935,1937,1939,1941,1943,1946,1948],{"class":66,"line":1018},[64,1936,259],{"class":86},[64,1938,125],{"class":102},[64,1940,264],{"class":82},[64,1942,87],{"class":86},[64,1944,1945],{"class":180},"8080",[64,1947,99],{"class":86},[64,1949,103],{"class":102},[46,1951,1953],{"id":1952},"客户端浏览器或-nodejs","客户端（浏览器或 Node.js）",[55,1955,1957],{"className":57,"code":1956,"language":59,"meta":60,"style":60},"const ws = new WebSocket(\"ws:\u002F\u002Flocalhost:8080\");\nws.onopen = () => ws.send(\"Hello\");\nws.onmessage = e => console.log(\"收到:\", e.data);\n",[38,1958,1959,1984,2018],{"__ignoreMap":60},[64,1960,1961,1963,1965,1967,1969,1971,1973,1975,1978,1980,1982],{"class":66,"line":67},[64,1962,71],{"class":70},[64,1964,1836],{"class":74},[64,1966,79],{"class":78},[64,1968,1103],{"class":78},[64,1970,1514],{"class":82},[64,1972,87],{"class":86},[64,1974,91],{"class":90},[64,1976,1977],{"class":94},"ws:\u002F\u002Flocalhost:8080",[64,1979,91],{"class":90},[64,1981,99],{"class":86},[64,1983,103],{"class":102},[64,1985,1986,1988,1990,1993,1995,1997,1999,2001,2003,2005,2007,2009,2012,2014,2016],{"class":66,"line":106},[64,1987,1447],{"class":86},[64,1989,125],{"class":102},[64,1991,1992],{"class":82},"onopen",[64,1994,79],{"class":78},[64,1996,274],{"class":102},[64,1998,147],{"class":70},[64,2000,1836],{"class":86},[64,2002,125],{"class":102},[64,2004,1869],{"class":82},[64,2006,87],{"class":86},[64,2008,91],{"class":90},[64,2010,2011],{"class":94},"Hello",[64,2013,91],{"class":90},[64,2015,99],{"class":86},[64,2017,103],{"class":102},[64,2019,2020,2022,2024,2027,2029,2031,2033,2035,2037,2039,2041,2043,2046,2048,2050,2052,2054,2057],{"class":66,"line":113},[64,2021,1447],{"class":86},[64,2023,125],{"class":102},[64,2025,2026],{"class":82},"onmessage",[64,2028,79],{"class":78},[64,2030,944],{"class":135},[64,2032,147],{"class":70},[64,2034,949],{"class":86},[64,2036,125],{"class":102},[64,2038,289],{"class":82},[64,2040,87],{"class":86},[64,2042,91],{"class":90},[64,2044,2045],{"class":94},"收到:",[64,2047,91],{"class":90},[64,2049,139],{"class":102},[64,2051,944],{"class":86},[64,2053,125],{"class":102},[64,2055,2056],{"class":86},"data)",[64,2058,103],{"class":102},[46,2060,2061],{"id":2061},"功能扩展",[313,2063,2064,2067],{},[316,2065,2066],{},"心跳检测：使用定时器发送 ping\u002Fpong。",[316,2068,2069,2070,1277,2073,2076],{},"房间管理：维护 ",[38,2071,2072],{},"Set",[38,2074,2075],{},"Map"," 存储客户端分组。",[31,2078,2080],{"id":2079},"三tcpudp","三、TCP\u002FUDP",[46,2082,2084,2085,2088],{"id":2083},"_1-tcp-服务器与客户端net-模块","1. TCP 服务器与客户端（",[38,2086,2087],{},"net"," 模块）",[28,2090,2091,344],{},[341,2092,2093],{},"TCP 服务器",[55,2095,2097],{"className":57,"code":2096,"language":59,"meta":60,"style":60},"const net = require(\"net\");\n\nconst server = net.createServer(socket => {\n    console.log(\"客户端已连接\");\n    socket.on(\"data\", data => {\n        console.log(`收到: ${data}`);\n        socket.write(\"Echo: \" + data);\n    });\n    socket.on(\"end\", () => console.log(\"客户端断开\"));\n    socket.write(\"欢迎\\r\\n\");\n});\n\nserver.listen(3000, () => console.log(\"TCP 服务器监听 3000\"));\n",[38,2098,2099,2122,2126,2149,2170,2195,2220,2247,2255,2297,2321,2329,2333],{"__ignoreMap":60},[64,2100,2101,2103,2106,2108,2110,2112,2114,2116,2118,2120],{"class":66,"line":67},[64,2102,71],{"class":70},[64,2104,2105],{"class":74}," net",[64,2107,79],{"class":78},[64,2109,83],{"class":82},[64,2111,87],{"class":86},[64,2113,91],{"class":90},[64,2115,2087],{"class":94},[64,2117,91],{"class":90},[64,2119,99],{"class":86},[64,2121,103],{"class":102},[64,2123,2124],{"class":66,"line":106},[64,2125,110],{"emptyLinePlaceholder":109},[64,2127,2128,2130,2132,2134,2136,2138,2140,2142,2145,2147],{"class":66,"line":113},[64,2129,71],{"class":70},[64,2131,118],{"class":74},[64,2133,79],{"class":78},[64,2135,2105],{"class":86},[64,2137,125],{"class":102},[64,2139,128],{"class":82},[64,2141,87],{"class":86},[64,2143,2144],{"class":135},"socket",[64,2146,147],{"class":70},[64,2148,150],{"class":102},[64,2150,2151,2153,2155,2157,2159,2161,2164,2166,2168],{"class":66,"line":153},[64,2152,284],{"class":86},[64,2154,125],{"class":102},[64,2156,289],{"class":82},[64,2158,87],{"class":177},[64,2160,91],{"class":90},[64,2162,2163],{"class":94},"客户端已连接",[64,2165,91],{"class":90},[64,2167,99],{"class":177},[64,2169,103],{"class":102},[64,2171,2172,2174,2176,2178,2180,2182,2184,2186,2188,2191,2193],{"class":66,"line":160},[64,2173,1353],{"class":86},[64,2175,125],{"class":102},[64,2177,402],{"class":82},[64,2179,87],{"class":177},[64,2181,91],{"class":90},[64,2183,409],{"class":94},[64,2185,91],{"class":90},[64,2187,139],{"class":102},[64,2189,2190],{"class":135}," data",[64,2192,147],{"class":70},[64,2194,150],{"class":102},[64,2196,2197,2199,2201,2203,2205,2207,2210,2212,2214,2216,2218],{"class":66,"line":166},[64,2198,801],{"class":86},[64,2200,125],{"class":102},[64,2202,289],{"class":82},[64,2204,87],{"class":177},[64,2206,810],{"class":90},[64,2208,2209],{"class":94},"收到: ",[64,2211,816],{"class":90},[64,2213,409],{"class":86},[64,2215,826],{"class":90},[64,2217,99],{"class":177},[64,2219,103],{"class":102},[64,2221,2222,2225,2227,2229,2231,2233,2236,2238,2241,2243,2245],{"class":66,"line":215},[64,2223,2224],{"class":86},"        socket",[64,2226,125],{"class":102},[64,2228,572],{"class":82},[64,2230,87],{"class":177},[64,2232,91],{"class":90},[64,2234,2235],{"class":94},"Echo: ",[64,2237,91],{"class":90},[64,2239,2240],{"class":78}," +",[64,2242,2190],{"class":86},[64,2244,99],{"class":177},[64,2246,103],{"class":102},[64,2248,2249,2251,2253],{"class":66,"line":241},[64,2250,1895],{"class":102},[64,2252,99],{"class":177},[64,2254,103],{"class":102},[64,2256,2257,2259,2261,2263,2265,2267,2269,2271,2273,2275,2277,2279,2281,2283,2285,2287,2290,2292,2295],{"class":66,"line":251},[64,2258,1353],{"class":86},[64,2260,125],{"class":102},[64,2262,402],{"class":82},[64,2264,87],{"class":177},[64,2266,91],{"class":90},[64,2268,222],{"class":94},[64,2270,91],{"class":90},[64,2272,139],{"class":102},[64,2274,274],{"class":102},[64,2276,147],{"class":70},[64,2278,949],{"class":86},[64,2280,125],{"class":102},[64,2282,289],{"class":82},[64,2284,87],{"class":177},[64,2286,91],{"class":90},[64,2288,2289],{"class":94},"客户端断开",[64,2291,91],{"class":90},[64,2293,2294],{"class":177},"))",[64,2296,103],{"class":102},[64,2298,2299,2301,2303,2305,2307,2309,2312,2315,2317,2319],{"class":66,"line":256},[64,2300,1353],{"class":86},[64,2302,125],{"class":102},[64,2304,572],{"class":82},[64,2306,87],{"class":177},[64,2308,91],{"class":90},[64,2310,2311],{"class":94},"欢迎",[64,2313,2314],{"class":74},"\\r\\n",[64,2316,91],{"class":90},[64,2318,99],{"class":177},[64,2320,103],{"class":102},[64,2322,2323,2325,2327],{"class":66,"line":281},[64,2324,244],{"class":102},[64,2326,99],{"class":86},[64,2328,103],{"class":102},[64,2330,2331],{"class":66,"line":305},[64,2332,110],{"emptyLinePlaceholder":109},[64,2334,2335,2337,2339,2341,2343,2345,2347,2349,2351,2353,2355,2357,2359,2361,2364,2366,2368],{"class":66,"line":798},[64,2336,259],{"class":86},[64,2338,125],{"class":102},[64,2340,264],{"class":82},[64,2342,87],{"class":86},[64,2344,269],{"class":180},[64,2346,139],{"class":102},[64,2348,274],{"class":102},[64,2350,147],{"class":70},[64,2352,949],{"class":86},[64,2354,125],{"class":102},[64,2356,289],{"class":82},[64,2358,87],{"class":86},[64,2360,91],{"class":90},[64,2362,2363],{"class":94},"TCP 服务器监听 3000",[64,2365,91],{"class":90},[64,2367,2294],{"class":86},[64,2369,103],{"class":102},[28,2371,2372,344],{},[341,2373,2374],{},"TCP 客户端",[55,2376,2378],{"className":57,"code":2377,"language":59,"meta":60,"style":60},"const net = require(\"net\");\nconst client = net.createConnection({ port: 3000 }, () => {\n    console.log(\"已连接\");\n    client.write(\"Hello 服务器\\r\\n\");\n});\nclient.on(\"data\", data => console.log(data.toString()));\nclient.on(\"end\", () => console.log(\"服务器关闭连接\"));\n",[38,2379,2380,2402,2438,2459,2483,2491,2531],{"__ignoreMap":60},[64,2381,2382,2384,2386,2388,2390,2392,2394,2396,2398,2400],{"class":66,"line":67},[64,2383,71],{"class":70},[64,2385,2105],{"class":74},[64,2387,79],{"class":78},[64,2389,83],{"class":82},[64,2391,87],{"class":86},[64,2393,91],{"class":90},[64,2395,2087],{"class":94},[64,2397,91],{"class":90},[64,2399,99],{"class":86},[64,2401,103],{"class":102},[64,2403,2404,2406,2408,2410,2412,2414,2417,2419,2421,2424,2426,2429,2432,2434,2436],{"class":66,"line":106},[64,2405,71],{"class":70},[64,2407,1841],{"class":74},[64,2409,79],{"class":78},[64,2411,2105],{"class":86},[64,2413,125],{"class":102},[64,2415,2416],{"class":82},"createConnection",[64,2418,87],{"class":86},[64,2420,1110],{"class":102},[64,2422,2423],{"class":177}," port",[64,2425,198],{"class":102},[64,2427,2428],{"class":180}," 3000",[64,2430,2431],{"class":102}," },",[64,2433,274],{"class":102},[64,2435,147],{"class":70},[64,2437,150],{"class":102},[64,2439,2440,2442,2444,2446,2448,2450,2453,2455,2457],{"class":66,"line":113},[64,2441,284],{"class":86},[64,2443,125],{"class":102},[64,2445,289],{"class":82},[64,2447,87],{"class":177},[64,2449,91],{"class":90},[64,2451,2452],{"class":94},"已连接",[64,2454,91],{"class":90},[64,2456,99],{"class":177},[64,2458,103],{"class":102},[64,2460,2461,2464,2466,2468,2470,2472,2475,2477,2479,2481],{"class":66,"line":153},[64,2462,2463],{"class":86},"    client",[64,2465,125],{"class":102},[64,2467,572],{"class":82},[64,2469,87],{"class":177},[64,2471,91],{"class":90},[64,2473,2474],{"class":94},"Hello 服务器",[64,2476,2314],{"class":74},[64,2478,91],{"class":90},[64,2480,99],{"class":177},[64,2482,103],{"class":102},[64,2484,2485,2487,2489],{"class":66,"line":160},[64,2486,244],{"class":102},[64,2488,99],{"class":86},[64,2490,103],{"class":102},[64,2492,2493,2495,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519,2522,2524,2526,2529],{"class":66,"line":166},[64,2494,1817],{"class":86},[64,2496,125],{"class":102},[64,2498,402],{"class":82},[64,2500,87],{"class":86},[64,2502,91],{"class":90},[64,2504,409],{"class":94},[64,2506,91],{"class":90},[64,2508,139],{"class":102},[64,2510,2190],{"class":135},[64,2512,147],{"class":70},[64,2514,949],{"class":86},[64,2516,125],{"class":102},[64,2518,289],{"class":82},[64,2520,2521],{"class":86},"(data",[64,2523,125],{"class":102},[64,2525,435],{"class":82},[64,2527,2528],{"class":86},"()))",[64,2530,103],{"class":102},[64,2532,2533,2535,2537,2539,2541,2543,2545,2547,2549,2551,2553,2555,2557,2559,2561,2563,2566,2568,2570],{"class":66,"line":215},[64,2534,1817],{"class":86},[64,2536,125],{"class":102},[64,2538,402],{"class":82},[64,2540,87],{"class":86},[64,2542,91],{"class":90},[64,2544,222],{"class":94},[64,2546,91],{"class":90},[64,2548,139],{"class":102},[64,2550,274],{"class":102},[64,2552,147],{"class":70},[64,2554,949],{"class":86},[64,2556,125],{"class":102},[64,2558,289],{"class":82},[64,2560,87],{"class":86},[64,2562,91],{"class":90},[64,2564,2565],{"class":94},"服务器关闭连接",[64,2567,91],{"class":90},[64,2569,2294],{"class":86},[64,2571,103],{"class":102},[46,2573,2575,2576,2088],{"id":2574},"_2-udp-通信dgram-模块","2. UDP 通信（",[38,2577,2578],{},"dgram",[28,2580,2581],{},"UDP 无连接，适用于低延迟、丢包容忍的场景。",[28,2583,2584,344],{},[341,2585,2586],{},"UDP 服务器",[55,2588,2590],{"className":57,"code":2589,"language":59,"meta":60,"style":60},"const dgram = require(\"dgram\");\nconst server = dgram.createSocket(\"udp4\");\n\nserver.on(\"message\", (msg, rinfo) => {\n    console.log(`收到来自 ${rinfo.address}:${rinfo.port} 的消息: ${msg}`);\n    server.send(\"已收到\", rinfo.port, rinfo.address);\n});\n\nserver.bind(41234, () => console.log(\"UDP 服务器启动 41234\"));\n",[38,2591,2592,2615,2643,2647,2681,2734,2772,2780,2784],{"__ignoreMap":60},[64,2593,2594,2596,2599,2601,2603,2605,2607,2609,2611,2613],{"class":66,"line":67},[64,2595,71],{"class":70},[64,2597,2598],{"class":74}," dgram",[64,2600,79],{"class":78},[64,2602,83],{"class":82},[64,2604,87],{"class":86},[64,2606,91],{"class":90},[64,2608,2578],{"class":94},[64,2610,91],{"class":90},[64,2612,99],{"class":86},[64,2614,103],{"class":102},[64,2616,2617,2619,2621,2623,2625,2627,2630,2632,2634,2637,2639,2641],{"class":66,"line":106},[64,2618,71],{"class":70},[64,2620,118],{"class":74},[64,2622,79],{"class":78},[64,2624,2598],{"class":86},[64,2626,125],{"class":102},[64,2628,2629],{"class":82},"createSocket",[64,2631,87],{"class":86},[64,2633,91],{"class":90},[64,2635,2636],{"class":94},"udp4",[64,2638,91],{"class":90},[64,2640,99],{"class":86},[64,2642,103],{"class":102},[64,2644,2645],{"class":66,"line":113},[64,2646,110],{"emptyLinePlaceholder":109},[64,2648,2649,2651,2653,2655,2657,2659,2661,2663,2665,2667,2670,2672,2675,2677,2679],{"class":66,"line":153},[64,2650,259],{"class":86},[64,2652,125],{"class":102},[64,2654,402],{"class":82},[64,2656,87],{"class":86},[64,2658,91],{"class":90},[64,2660,1756],{"class":94},[64,2662,91],{"class":90},[64,2664,139],{"class":102},[64,2666,1573],{"class":102},[64,2668,2669],{"class":135},"msg",[64,2671,139],{"class":102},[64,2673,2674],{"class":135}," rinfo",[64,2676,99],{"class":102},[64,2678,147],{"class":70},[64,2680,150],{"class":102},[64,2682,2683,2685,2687,2689,2691,2693,2696,2698,2701,2703,2706,2708,2710,2712,2714,2716,2719,2721,2724,2726,2728,2730,2732],{"class":66,"line":160},[64,2684,284],{"class":86},[64,2686,125],{"class":102},[64,2688,289],{"class":82},[64,2690,87],{"class":177},[64,2692,810],{"class":90},[64,2694,2695],{"class":94},"收到来自 ",[64,2697,816],{"class":90},[64,2699,2700],{"class":86},"rinfo",[64,2702,125],{"class":90},[64,2704,2705],{"class":86},"address",[64,2707,244],{"class":90},[64,2709,198],{"class":94},[64,2711,816],{"class":90},[64,2713,2700],{"class":86},[64,2715,125],{"class":90},[64,2717,2718],{"class":86},"port",[64,2720,244],{"class":90},[64,2722,2723],{"class":94}," 的消息: ",[64,2725,816],{"class":90},[64,2727,2669],{"class":86},[64,2729,826],{"class":90},[64,2731,99],{"class":177},[64,2733,103],{"class":102},[64,2735,2736,2739,2741,2743,2745,2747,2750,2752,2754,2756,2758,2760,2762,2764,2766,2768,2770],{"class":66,"line":166},[64,2737,2738],{"class":86},"    server",[64,2740,125],{"class":102},[64,2742,1869],{"class":82},[64,2744,87],{"class":177},[64,2746,91],{"class":90},[64,2748,2749],{"class":94},"已收到",[64,2751,91],{"class":90},[64,2753,139],{"class":102},[64,2755,2674],{"class":86},[64,2757,125],{"class":102},[64,2759,2718],{"class":86},[64,2761,139],{"class":102},[64,2763,2674],{"class":86},[64,2765,125],{"class":102},[64,2767,2705],{"class":86},[64,2769,99],{"class":177},[64,2771,103],{"class":102},[64,2773,2774,2776,2778],{"class":66,"line":215},[64,2775,244],{"class":102},[64,2777,99],{"class":86},[64,2779,103],{"class":102},[64,2781,2782],{"class":66,"line":241},[64,2783,110],{"emptyLinePlaceholder":109},[64,2785,2786,2788,2790,2793,2795,2798,2800,2802,2804,2806,2808,2810,2812,2814,2817,2819,2821],{"class":66,"line":251},[64,2787,259],{"class":86},[64,2789,125],{"class":102},[64,2791,2792],{"class":82},"bind",[64,2794,87],{"class":86},[64,2796,2797],{"class":180},"41234",[64,2799,139],{"class":102},[64,2801,274],{"class":102},[64,2803,147],{"class":70},[64,2805,949],{"class":86},[64,2807,125],{"class":102},[64,2809,289],{"class":82},[64,2811,87],{"class":86},[64,2813,91],{"class":90},[64,2815,2816],{"class":94},"UDP 服务器启动 41234",[64,2818,91],{"class":90},[64,2820,2294],{"class":86},[64,2822,103],{"class":102},[28,2824,2825,344],{},[341,2826,2827],{},"UDP 客户端",[55,2829,2831],{"className":57,"code":2830,"language":59,"meta":60,"style":60},"const dgram = require(\"dgram\");\nconst client = dgram.createSocket(\"udp4\");\nclient.send(\"Hello UDP\", 41234, \"localhost\", err => {\n    if (err) console.error(err);\n    else console.log(\"消息已发送\");\n});\nclient.on(\"message\", msg => console.log(\"服务端回复:\", msg.toString()));\n",[38,2832,2833,2855,2881,2921,2947,2971,2979],{"__ignoreMap":60},[64,2834,2835,2837,2839,2841,2843,2845,2847,2849,2851,2853],{"class":66,"line":67},[64,2836,71],{"class":70},[64,2838,2598],{"class":74},[64,2840,79],{"class":78},[64,2842,83],{"class":82},[64,2844,87],{"class":86},[64,2846,91],{"class":90},[64,2848,2578],{"class":94},[64,2850,91],{"class":90},[64,2852,99],{"class":86},[64,2854,103],{"class":102},[64,2856,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875,2877,2879],{"class":66,"line":106},[64,2858,71],{"class":70},[64,2860,1841],{"class":74},[64,2862,79],{"class":78},[64,2864,2598],{"class":86},[64,2866,125],{"class":102},[64,2868,2629],{"class":82},[64,2870,87],{"class":86},[64,2872,91],{"class":90},[64,2874,2636],{"class":94},[64,2876,91],{"class":90},[64,2878,99],{"class":86},[64,2880,103],{"class":102},[64,2882,2883,2885,2887,2889,2891,2893,2896,2898,2900,2903,2905,2907,2910,2912,2914,2917,2919],{"class":66,"line":113},[64,2884,1817],{"class":86},[64,2886,125],{"class":102},[64,2888,1869],{"class":82},[64,2890,87],{"class":86},[64,2892,91],{"class":90},[64,2894,2895],{"class":94},"Hello UDP",[64,2897,91],{"class":90},[64,2899,139],{"class":102},[64,2901,2902],{"class":180}," 41234",[64,2904,139],{"class":102},[64,2906,189],{"class":90},[64,2908,2909],{"class":94},"localhost",[64,2911,91],{"class":90},[64,2913,139],{"class":102},[64,2915,2916],{"class":135}," err",[64,2918,147],{"class":70},[64,2920,150],{"class":102},[64,2922,2923,2925,2927,2930,2932,2935,2937,2939,2941,2943,2945],{"class":66,"line":153},[64,2924,1570],{"class":1569},[64,2926,1573],{"class":177},[64,2928,2929],{"class":86},"err",[64,2931,1610],{"class":177},[64,2933,2934],{"class":86},"console",[64,2936,125],{"class":102},[64,2938,937],{"class":82},[64,2940,87],{"class":177},[64,2942,2929],{"class":86},[64,2944,99],{"class":177},[64,2946,103],{"class":102},[64,2948,2949,2952,2954,2956,2958,2960,2962,2965,2967,2969],{"class":66,"line":160},[64,2950,2951],{"class":1569},"    else",[64,2953,949],{"class":86},[64,2955,125],{"class":102},[64,2957,289],{"class":82},[64,2959,87],{"class":177},[64,2961,91],{"class":90},[64,2963,2964],{"class":94},"消息已发送",[64,2966,91],{"class":90},[64,2968,99],{"class":177},[64,2970,103],{"class":102},[64,2972,2973,2975,2977],{"class":66,"line":166},[64,2974,244],{"class":102},[64,2976,99],{"class":86},[64,2978,103],{"class":102},[64,2980,2981,2983,2985,2987,2989,2991,2993,2995,2997,3000,3002,3004,3006,3008,3010,3012,3015,3017,3019,3021,3023,3025,3027],{"class":66,"line":215},[64,2982,1817],{"class":86},[64,2984,125],{"class":102},[64,2986,402],{"class":82},[64,2988,87],{"class":86},[64,2990,91],{"class":90},[64,2992,1756],{"class":94},[64,2994,91],{"class":90},[64,2996,139],{"class":102},[64,2998,2999],{"class":135}," msg",[64,3001,147],{"class":70},[64,3003,949],{"class":86},[64,3005,125],{"class":102},[64,3007,289],{"class":82},[64,3009,87],{"class":86},[64,3011,91],{"class":90},[64,3013,3014],{"class":94},"服务端回复:",[64,3016,91],{"class":90},[64,3018,139],{"class":102},[64,3020,2999],{"class":86},[64,3022,125],{"class":102},[64,3024,435],{"class":82},[64,3026,2528],{"class":86},[64,3028,103],{"class":102},[31,3030,3032,3033,3036,3037],{"id":3031},"四dns-解析dnslookup-vs-dnsresolve","四、DNS 解析：",[38,3034,3035],{},"dns.lookup"," vs ",[38,3038,3039],{},"dns.resolve",[28,3041,3042,3045],{},[38,3043,3044],{},"dns"," 模块提供域名解析功能。核心区别：",[3047,3048,3049,3071],"table",{},[3050,3051,3052],"thead",{},[3053,3054,3055,3059,3062,3065,3068],"tr",{},[3056,3057,3058],"th",{},"方法",[3056,3060,3061],{},"底层",[3056,3063,3064],{},"是否涉及系统 DNS 缓存",[3056,3066,3067],{},"返回类型",[3056,3069,3070],{},"适用场景",[3072,3073,3074,3108],"tbody",{},[3053,3075,3076,3081,3092,3095,3098],{},[3077,3078,3079],"td",{},[38,3080,3035],{},[3077,3082,3083,3084,3087,3088,3091],{},"与 ",[38,3085,3086],{},"getaddrinfo"," 相同，依赖操作系统配置（",[38,3089,3090],{},"\u002Fetc\u002Fhosts","、系统 DNS）",[3077,3093,3094],{},"是",[3077,3096,3097],{},"返回单个 IPv4\u002FIPv6 地址（或第一项）",[3077,3099,3100,3103,3104,3107],{},[341,3101,3102],{},"网络连接","，例如 ",[38,3105,3106],{},"net.createConnection"," 内部使用",[3053,3109,3110,3114,3117,3120,3134],{},[3077,3111,3112],{},[38,3113,3039],{},[3077,3115,3116],{},"直接使用 DNS 协议查询，不经过系统缓存",[3077,3118,3119],{},"否",[3077,3121,3122,3123,3126,3127,3126,3130,3133],{},"返回完整记录数组（可指定类型如 ",[38,3124,3125],{},"A","、",[38,3128,3129],{},"AAAA",[38,3131,3132],{},"MX"," 等）",[3077,3135,3136],{},"获取完整 DNS 记录，或编程式排查",[46,3138,3139],{"id":3139},"示例",[55,3141,3143],{"className":57,"code":3142,"language":59,"meta":60,"style":60},"const dns = require(\"dns\");\n\ndns.lookup(\"example.com\", (err, address, family) => {\n    console.log(\"lookup:\", address); \u002F\u002F 通常一个IP\n});\n\ndns.resolve4(\"example.com\", (err, addresses) => {\n    console.log(\"resolve4:\", addresses); \u002F\u002F IP数组\n});\n\ndns.resolveMx(\"gmail.com\", (err, addresses) => {\n    console.log(\"MX记录:\", addresses);\n});\n",[38,3144,3145,3168,3172,3211,3239,3247,3251,3285,3313,3321,3325,3359,3384],{"__ignoreMap":60},[64,3146,3147,3149,3152,3154,3156,3158,3160,3162,3164,3166],{"class":66,"line":67},[64,3148,71],{"class":70},[64,3150,3151],{"class":74}," dns",[64,3153,79],{"class":78},[64,3155,83],{"class":82},[64,3157,87],{"class":86},[64,3159,91],{"class":90},[64,3161,3044],{"class":94},[64,3163,91],{"class":90},[64,3165,99],{"class":86},[64,3167,103],{"class":102},[64,3169,3170],{"class":66,"line":106},[64,3171,110],{"emptyLinePlaceholder":109},[64,3173,3174,3176,3178,3181,3183,3185,3187,3189,3191,3193,3195,3197,3200,3202,3205,3207,3209],{"class":66,"line":113},[64,3175,3044],{"class":86},[64,3177,125],{"class":102},[64,3179,3180],{"class":82},"lookup",[64,3182,87],{"class":86},[64,3184,91],{"class":90},[64,3186,709],{"class":94},[64,3188,91],{"class":90},[64,3190,139],{"class":102},[64,3192,1573],{"class":102},[64,3194,2929],{"class":135},[64,3196,139],{"class":102},[64,3198,3199],{"class":135}," address",[64,3201,139],{"class":102},[64,3203,3204],{"class":135}," family",[64,3206,99],{"class":102},[64,3208,147],{"class":70},[64,3210,150],{"class":102},[64,3212,3213,3215,3217,3219,3221,3223,3226,3228,3230,3232,3234,3236],{"class":66,"line":153},[64,3214,284],{"class":86},[64,3216,125],{"class":102},[64,3218,289],{"class":82},[64,3220,87],{"class":177},[64,3222,91],{"class":90},[64,3224,3225],{"class":94},"lookup:",[64,3227,91],{"class":90},[64,3229,139],{"class":102},[64,3231,3199],{"class":86},[64,3233,99],{"class":177},[64,3235,598],{"class":102},[64,3237,3238],{"class":156}," \u002F\u002F 通常一个IP\n",[64,3240,3241,3243,3245],{"class":66,"line":160},[64,3242,244],{"class":102},[64,3244,99],{"class":86},[64,3246,103],{"class":102},[64,3248,3249],{"class":66,"line":166},[64,3250,110],{"emptyLinePlaceholder":109},[64,3252,3253,3255,3257,3260,3262,3264,3266,3268,3270,3272,3274,3276,3279,3281,3283],{"class":66,"line":215},[64,3254,3044],{"class":86},[64,3256,125],{"class":102},[64,3258,3259],{"class":82},"resolve4",[64,3261,87],{"class":86},[64,3263,91],{"class":90},[64,3265,709],{"class":94},[64,3267,91],{"class":90},[64,3269,139],{"class":102},[64,3271,1573],{"class":102},[64,3273,2929],{"class":135},[64,3275,139],{"class":102},[64,3277,3278],{"class":135}," addresses",[64,3280,99],{"class":102},[64,3282,147],{"class":70},[64,3284,150],{"class":102},[64,3286,3287,3289,3291,3293,3295,3297,3300,3302,3304,3306,3308,3310],{"class":66,"line":241},[64,3288,284],{"class":86},[64,3290,125],{"class":102},[64,3292,289],{"class":82},[64,3294,87],{"class":177},[64,3296,91],{"class":90},[64,3298,3299],{"class":94},"resolve4:",[64,3301,91],{"class":90},[64,3303,139],{"class":102},[64,3305,3278],{"class":86},[64,3307,99],{"class":177},[64,3309,598],{"class":102},[64,3311,3312],{"class":156}," \u002F\u002F IP数组\n",[64,3314,3315,3317,3319],{"class":66,"line":251},[64,3316,244],{"class":102},[64,3318,99],{"class":86},[64,3320,103],{"class":102},[64,3322,3323],{"class":66,"line":256},[64,3324,110],{"emptyLinePlaceholder":109},[64,3326,3327,3329,3331,3334,3336,3338,3341,3343,3345,3347,3349,3351,3353,3355,3357],{"class":66,"line":281},[64,3328,3044],{"class":86},[64,3330,125],{"class":102},[64,3332,3333],{"class":82},"resolveMx",[64,3335,87],{"class":86},[64,3337,91],{"class":90},[64,3339,3340],{"class":94},"gmail.com",[64,3342,91],{"class":90},[64,3344,139],{"class":102},[64,3346,1573],{"class":102},[64,3348,2929],{"class":135},[64,3350,139],{"class":102},[64,3352,3278],{"class":135},[64,3354,99],{"class":102},[64,3356,147],{"class":70},[64,3358,150],{"class":102},[64,3360,3361,3363,3365,3367,3369,3371,3374,3376,3378,3380,3382],{"class":66,"line":305},[64,3362,284],{"class":86},[64,3364,125],{"class":102},[64,3366,289],{"class":82},[64,3368,87],{"class":177},[64,3370,91],{"class":90},[64,3372,3373],{"class":94},"MX记录:",[64,3375,91],{"class":90},[64,3377,139],{"class":102},[64,3379,3278],{"class":86},[64,3381,99],{"class":177},[64,3383,103],{"class":102},[64,3385,3386,3388,3390],{"class":66,"line":798},[64,3387,244],{"class":102},[64,3389,99],{"class":86},[64,3391,103],{"class":102},[28,3393,3394,3397,3398,3400,3401,1281],{},[341,3395,3396],{},"选择建议","：一般使用 ",[38,3399,3035],{}," 进行网络连接；若需要获取所有记录或特定类型（如 MX、TXT），使用 ",[38,3402,3039],{},[31,3404,3405],{"id":3405},"总结",[3047,3407,3408,3421],{},[3050,3409,3410],{},[3053,3411,3412,3415,3418],{},[3056,3413,3414],{},"模块\u002F功能",[3056,3416,3417],{},"核心用途",[3056,3419,3420],{},"常用 API",[3072,3422,3423,3446,3463,3478,3495],{},[3053,3424,3425,3432,3435],{},[3077,3426,3427,3429,3430],{},[38,3428,13],{}," \u002F ",[38,3431,43],{},[3077,3433,3434],{},"构建 Web 服务器和客户端",[3077,3436,3437,3439,3440,3439,3442,3439,3444],{},[38,3438,128],{},", ",[38,3441,689],{},[38,3443,992],{},[38,3445,1215],{},[3053,3447,3448,3452,3455],{},[3077,3449,3450],{},[38,3451,1447],{},[3077,3453,3454],{},"WebSocket 实时通信",[3077,3456,3457,3439,3460],{},[38,3458,3459],{},"WebSocket.Server",[38,3461,3462],{},"ws.send",[3053,3464,3465,3469,3472],{},[3077,3466,3467],{},[38,3468,2087],{},[3077,3470,3471],{},"TCP 流式通信",[3077,3473,3474,3439,3476],{},[38,3475,128],{},[38,3477,2416],{},[3053,3479,3480,3484,3487],{},[3077,3481,3482],{},[38,3483,2578],{},[3077,3485,3486],{},"UDP 数据报通信",[3077,3488,3489,3439,3491,3439,3493],{},[38,3490,2629],{},[38,3492,1869],{},[38,3494,2792],{},[3053,3496,3497,3501,3504],{},[3077,3498,3499],{},[38,3500,3044],{},[3077,3502,3503],{},"域名解析",[3077,3505,3506,3439,3508,3511],{},[38,3507,3180],{},[38,3509,3510],{},"resolve"," 系列",[28,3513,3514],{},"掌握这些模块，可以搭建各种网络应用，从简单的 HTTP 服务到复杂的实时聊天系统。推荐结合官方文档和实际项目练习，加深理解。",[3516,3517,3518],"style",{},"html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZUrc, html code.shiki .sZUrc{--shiki-light:#E53935;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}",{"title":60,"searchDepth":106,"depth":106,"links":3520},[3521],{"id":25,"depth":106,"text":26,"children":3522},[3523,3524,3526,3527,3529],{"id":33,"depth":113,"text":34},{"id":1443,"depth":113,"text":3525},"二、WebSocket：ws 库集成与简单聊天",{"id":2079,"depth":113,"text":2080},{"id":3031,"depth":113,"text":3528},"四、DNS 解析：dns.lookup vs dns.resolve",{"id":3405,"depth":113,"text":3405},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fend\u002FNodeJs\u002Fcore\u002Fhttp","knowledge\u002Fknowledge\u002Fbooklet\u002Fend\u002FNodeJs\u002Fcore\u002Fhttp.md","md",{"items":3535},[3536,3540,3544,3548,3552,3556],{"path":3537,"title":3538,"description":3539,"category":10,"score":166},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Ffs","文件系统","Node.js 的 fs 模块提供了与文件系统交互的 API，几乎涵盖了所有标准文件操作。它支持三种风格的 API：同步、回调式异步 和 Promise 式异步。下面详细介绍这些 API 的选择策略、流式读写、文件监视以及常用操作。",{"path":3541,"title":3542,"description":3543,"category":10,"score":166},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fbuffer","缓冲区","Buffer 是 Node.js 全局对象，用于处理二进制数据流（如文件、网络数据）。在 ES6 引入 TypedArray 之前，Buffer 是 Node.js 处理二进制的主要方式；现在 Buffer 实现了 Uint8Arra…",{"path":3545,"title":3546,"description":3547,"category":10,"score":166},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fpath","路径处理","path 模块提供了用于处理和转换文件路径的实用工具。它是 Node.js 核心模块，无需安装即可直接使用。由于不同操作系统（Windows、Linux、macOS）的路径分隔符不同（Windows 使用反斜杠 \\，POSIX 使用正…",{"path":3549,"title":3550,"description":3551,"category":10,"score":166},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fprocess","进程与子进程","Node.js 在单个进程中运行，但通过 process 对象、child_process 模块及 worker_threads 模块提供了对进程的精细控制以及多进程\u002F多线程能力。下面从三个方面展开。",{"path":3553,"title":3554,"description":3555,"category":10,"score":166},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fstream","流","流是 Node.js 中处理有序数据的抽象接口，用于以连续方式异步读取或写入数据。它们特别适合处理大文件、网络通信或任何可能无限产生的数据。Node.js 内置的 stream 模块提供了四种基本流类型，以及用于组合和错误处理的工具函数。",{"path":3557,"title":3558,"description":3559,"category":10,"score":166},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fother","其他常用模块","以下是 Node.js 中几个重要内置模块的详细介绍，涵盖事件触发器、定时器、加密、压缩、操作系统信息和实用工具。",{"series":3561,"title":3562,"items":3563,"index":106,"prev":3577,"next":3578},"booklet\u002Fend\u002Fnodejs\u002Fcore","core",[3564,3566,3568,3569,3571,3573,3575],{"path":3541,"title":3542,"date":3565,"pinned":15},"2025-01-30",{"path":3537,"title":3538,"date":3567,"pinned":15},"2026-06-04",{"path":7,"title":8,"date":14,"pinned":15},{"path":3557,"title":3558,"date":3570,"pinned":15},"2020-03-27",{"path":3545,"title":3546,"date":3572,"pinned":15},"2024-03-14",{"path":3549,"title":3550,"date":3574,"pinned":15},"2023-11-10",{"path":3553,"title":3554,"date":3576,"pinned":15},"2022-05-03",{"path":3537,"title":3538,"date":3567,"pinned":15},{"path":3557,"title":3558,"date":3570,"pinned":15}]