วิธีเริ่มต้นใช้งาน VUE3.0 อย่างรวดเร็ว: เริ่มต้นการเรียนรู้
นี่คือบทความแรกในชุด Nodejs เมื่อฉันอ่านบทช่วยสอนก่อนหน้านี้ หลายๆ รายการเริ่มต้นด้วย IO, บัฟเฟอร์, เส้นทาง, เหตุการณ์, fs, กระบวนการ และ กลไกการวนซ้ำของโหนด . สิ่งเหล่านี้เป็นการพึ่งพาการพัฒนาที่การพัฒนาโหนดส่วนใหญ่ต้องอาศัย พูดถึงความสามารถที่มีอยู่นั่นคือวิธีการโต้ตอบกับมันในที่สุด ความรู้เบื้องต้นเกี่ยวกับโมดูลการสื่อสารกับลูกค้า
ฉันรู้สึกอึดอัดมากดังนั้นเมื่อฉันเขียนบทสรุปของตัวเองฉันต้องเขียนโมดูลที่สื่อสารระหว่างเซิร์ฟเวอร์
และลูกค้าจะต้องรู้สึกสบายใจก่อน แม้ว่าคะแนนความรู้ของโมดูลเหตุการณ์และโมดูล fs จะกับกระบวนการนี้ คุณสามารถพักไว้ก่อนและเพียงทำความเข้าใจว่า net
module ใช้การสื่อสารโดยรวมอย่างไร
หากคุณต้องการเรียนรู้โมดูลการสื่อสาร คุณต้องเข้าใจโมเดลการสื่อสารผ่านเครือข่าย หากคุณต้องการจดจำโมเดลการสื่อสารผ่านเครือข่าย คุณต้องฝึกฝนมัน เพื่อช่วยในเรื่องความจำ นี่คือจุดเน้นของการสัมภาษณ์ มีเนื้อหามากมายในเรื่องนี้ฉันต้องการให้มีความเข้าใจอย่างลึกซึ้งและต้องมีการศึกษาอย่างเป็นระบบนี่เป็นเพียงการกล่าวถึงสั้น ๆ เท่านั้น
:
สำหรับส่วนหน้าของเรา เราต้องจำผลลัพธ์ของระบบของชุดโปรโตคอล TCP/IP
: http (พอร์ต 80), FTP (21), SMTP (การส่งจดหมาย), POP (การรับจดหมาย), DNS
Transport layer : เลเยอร์อินเทอร์เน็ต TCP/UDP
: IP, ICMP (โปรโตคอลย่อยของเลเยอร์ IP)
เลเยอร์การเชื่อมโยงข้อมูล: PPP, SLIP
เลเยอร์ทางกายภาพ: เครือข่ายมีสายคู่ตีเกลียว, สายโคแอกเชียล, ใยแก้วนำแสง และวิธีการส่งสัญญาณอื่นๆ ตามข้อกำหนด ISO2110
จาก ICMP
ถึงสิ่งนี้ สามารถทราบได้จากโปรโตคอลที่แนบมากับโปรโตคอล IP ว่าไม่จำเป็นต้องกังวลมากเกินไปเกี่ยวกับการแบ่งชั้นของโปรโตคอลเครือข่าย เห็นได้ชัดว่า ICMP
ต้องการโปรโตคอล IP เป็นพื้นฐาน แต่ก็มีการวางแผนเป็นเลเยอร์เครือข่ายด้วย ฉันคิดว่าความเข้าใจที่ถูกต้องเกี่ยวกับโมเดล OSI ควรจะเป็น การใช้โมเดล OSI เพื่อวิเคราะห์ปัญหามากกว่าการใช้สิ่งที่เรียกว่าการแบ่งชั้นของ
โปรโตคอล และโปรโตคอล IP แต่เนื่องจากโปรโตคอลทั้งสองนี้อยู่นอกวงกลมมากเกินไป TCP จึงถูกนำมาใช้ /IP เรียกรวมกันว่าการรวบรวมโปรโตคอลที่เกี่ยวข้องกับอินเทอร์เน็ต กระบวนการใช้โปรโตคอล TCP/IP
ขั้นตอนการรับส่งข้อมูลของไคลเอ็นต์และเซิร์ฟเวอร์มีดังนี้
หากบทบาทกลายเป็น发送者
และ接受者
โฟลว์การส่งข้อมูลจะเป็นดังนี้:
จะเห็นได้ว่าในระหว่างกระบวนการส่งเริ่มต้นจากจุดสิ้นสุดการส่งข้อมูลส่วนหัวที่จำเป็นจะถูกเพิ่มเข้าไปโดยไม่ผ่านชั้นของโปรโตคอล ทำงานในทางตรงกันข้าม แต่ละเลเยอร์ส่งผ่าน Strip ส่วนหัวที่เกี่ยวข้อง เพียงรอจนกว่าจะได้รับข้อมูล HTTP สุดท้าย
จาก
"Illustrated HTTP" ด้านบน
คือโมเดลโปรโตคอลเครือข่ายทั่วไป
หลายที่รวมผลลัพธ์ของระบบ OSI เข้ากับ TCP/IP แล้ว หลังจากโปรโตคอล 5 เลเยอร์ ชื่อของเลเยอร์เครือข่ายจะกลายเป็นเลเยอร์อินเทอร์เน็ตหรือไม่
การจับมือกันครั้งแรก: ไคลเอนต์ส่งแฟล็ก SYN (หมายเลขลำดับคือ J) ไปยังเซิร์ฟเวอร์ และเข้าสู่สถานะ SYN_SENT (รอการยืนยันจากเซิร์ฟเวอร์)
การจับมือครั้งที่สอง: เซิร์ฟเวอร์ได้รับ SYN J จากไคลเอนต์ และเซิร์ฟเวอร์จะยืนยัน ได้รับแพ็กเก็ตข้อมูลและส่งบิตแฟล็ก ACK (หมายเลขลำดับคือ J + 1) และบิตแฟล็ก SYN (หมายเลขลำดับคือ K) จากนั้นเข้าสู่สถานะ SYN_REVD (คำขอการยอมรับและรอสถานะการยืนยันไคลเอ็นต์)
การจับมือครั้งที่สาม: ไคลเอนต์เข้าสู่ หลังจากสร้างการเชื่อมต่อแล้ว บิตแฟล็ก ACK (K+ 1) จะถูกส่งไปยังเซิร์ฟเวอร์เพื่อยืนยันว่าไคลเอนต์ได้รับการเชื่อมต่อที่สร้างขึ้น หลังจากที่เซิร์ฟเวอร์ได้รับแฟล็ก ACK เซิร์ฟเวอร์จะเข้าสู่สถานะการเชื่อมต่อที่สร้าง
ไว้ K ถูกใช้เพื่อกำหนดว่าใครคือคนเชื่อมต่อ ในคำขอ ไม่มีความแตกต่างในโครงสร้างของ SYN และ ACK แต่อ็อบเจ็กต์ที่ส่งจะแตกต่างกัน
net模块
เป็นการดำเนินการเฉพาะของการเชื่อมต่อ TCP ข้างต้น
ก่อนอื่นก็ยังแนะนำให้เข้าไปที่เอกสารทางการโดยตรงเพื่อเรียนรู้เกี่ยวกับ API ครับ เนื้อหาในเอกสารภาษาจีนจะเป็นเวอร์ชั่นล่าสุดครับ
เมื่อ
ผมเรียน ผมจะพยายามอ่านเอกสารภาษาอังกฤษเมื่อมีเวลาว่าง . ฉันยืนกรานเรื่องนี้มาครึ่งปีแล้ว ฉันไม่สามารถทนได้ แต่ตอนนี้ฉันทนไม่ไหวและอ่านมันมาได้ครึ่งปีแล้ว เป็นสิ่งที่ดี หมายความว่า นี่ไม่ใช่ Comfort Zone ของคุณ ท้ายที่สุดแล้ว ความกล้าที่จะข้าม Comfort Zone ของคุณคือที่มาของความก้าวหน้า
ต่อไป เรามาเข้าประเด็นกันดีกว่า วัตถุเพื่อจำลองไคลเอนต์และเซิร์ฟเวอร์ สร้างสองไฟล์ client.js
และ service.js
ตามลำดับ สร้างผ่านบรรทัดคำสั่ง:
touch client.js && touch service.js
แนะนำ net
module และปล่อยให้ เซิร์ฟเวอร์เข้าสู่สถานะ LISTENT
กำหนดค่าหมายเลขพอร์ตและที่อยู่ HOST (ข้ามกระบวนการแก้ไข DNS ด้วยตนเอง) และรอการโทรของลูกค้า
const net = need("net"); โพสต์ const = 3306; โฮสต์ const = "127.0.0.1"; เซิร์ฟเวอร์ const = net.createServer(); server.listen(post, host);
ในขณะนี้ เซิร์ฟเวอร์สอดคล้องกับสถานะ LISTEN
ของเซิร์ฟเวอร์ในการเชื่อมต่อ TCP
จากนั้นจะรับฟังเหตุการณ์ที่จำเป็นบางอย่างซึ่งเป็น hooks ที่จัดทำโดยเซิร์ฟเวอร์ (เป็นของความรู้ที่เกี่ยวข้องกับเหตุการณ์ )
server.on("กำลังฟัง", ( ) => { console.log("สามารถเชื่อมต่อเซิร์ฟเวอร์ได้"); - server.on("การเชื่อมต่อ", (ซ็อกเก็ต) => { console.log("ลูกค้ากำลังเยี่ยมชม"); - server.on("ปิด", () => { console.log("เซิร์ฟเวอร์ปิดตัวลง"); - server.on("ข้อผิดพลาด", (ข้อผิดพลาด) => { console.log("เซิร์ฟเวอร์มีข้อผิดพลาด: ", ข้อผิดพลาด); // ข้อผิดพลาดมีข้อมูลข้อผิดพลาด
}
listening
connection
การเข้าชมclose
: เกิดจากข้อผิดพลาดในการปิดเซิร์ฟเวอร์error
เกิดจากข้อผิดพลาดของเซิร์ฟเวอร์เกี่ยวกับ close
เราต้องให้ความสนใจกับความจริงที่ว่าพี่ชายพื้นหลังมักจะโดยตรง
PS Kill -9 pid
ดำเนินการโดยการฆ่าเธรด
ในสุนัข connection
ต่อ พารามิเตอร์ที่เป็นทางการคือชื่อซ็อกเก็ต มันคือคำที่ซ้อนกัน ซึ่งถูกห่อหุ้มไว้ในสตรีมตามโหนด ข้อมูลที่ส่งโดยไคลเอนต์ นี่เป็นเพราะว่าข้อมูลนั้นมีวิธีการของตัวเอง ฉันประมวลผล socket
connection
เซิร์ฟเวอร์การเชื่อมต่อ
console.log("ลูกค้ากำลังเยี่ยมชม"); socket.on("ข้อมูล", (ข้อมูล) => { console.log(data); //ข้อมูลที่ส่งโดยลูกค้า}); })
เนื่องจากเซิร์ฟเวอร์สามารถรับข้อมูลที่ส่งโดยสตรีมจะถูกนำมาใช้ในบทความต่อๆ ไป
ไคลเอ็นต์
ได้ จึงสามารถตอบกลับไปยัง socket.on
ได้ตามธรรมชาติ
("ฉันได้รับเซิร์ฟเวอร์ของคุณแล้ว ไคลเอนต์");
ในขณะนี้ หากไคลเอนต์ได้รับข้อมูลเสร็จสิ้นแล้วจึงปิดการเชื่อมต่อ เรายังสามารถตรวจสอบได้ผ่านทาง socket.on('close')
hook :
socket.on ("ปิด", () => { console.log("ไคลเอนต์ปิดปลายอีกด้านหนึ่งของสตรีม"); });
ใส่ข้อมูลสรุปของเหตุการณ์ socket
ใน client.js
ในขณะนี้ เนื้อหาทั้งหมดของ service.js
มีดังนี้:
const net = need("net"); โพสต์ const = 3306; โฮสต์ const = "127.0.0.1"; เซิร์ฟเวอร์ const = net.createServer(); server.listen (โพสต์, โฮสต์); server.on("กำลังฟัง", () => { console.log("สามารถเชื่อมต่อเซิร์ฟเวอร์ได้"); - server.on("การเชื่อมต่อ", (ซ็อกเก็ต) => { console.log("ลูกค้ากำลังเยี่ยมชม"); socket.on("ข้อมูล", (ข้อมูล) => { console.log(data); //ข้อมูลที่ส่งโดยไคลเอนต์ socket.write("ฉันได้รับจากเซิร์ฟเวอร์ของคุณ, ไคลเอนต์"); - socket.on("ปิด", () => { console.log("ไคลเอนต์ปิดปลายอีกด้านหนึ่งของสตรีม"); server.close(); // ลูกค้าไม่ต้องการข้อมูลอีกต่อไป ดังนั้นมาปิดเซิร์ฟเวอร์กันเถอะ}); - server.on("ปิด", () => { console.log("เซิร์ฟเวอร์ปิดตัวลง"); - server.on("ข้อผิดพลาด", (ข้อผิดพลาด) => { console.log("The server has an error: ", error); // error has error information});
ส่วนของไคลเอ็นต์นั้นง่ายกว่ามาก
const net = need("net"); โพสต์ const = 3306; โฮสต์ const = "127.0.0.1"; const socket = net.connect (โพสต์, โฮสต์); socket.on("เชื่อมต่อ", () => { console.log("เชื่อมต่อกับเซิร์ฟเวอร์แล้ว"); - socket.write("เซิร์ฟเวอร์ มาแล้ว"); socket.on("ข้อมูล", (ข้อมูล) => { console.log(data.toString()); ซ็อกเก็ต.end(); - socket.on("ปิด", () => { console.log("การเชื่อมต่อถูกปิด"); });
สรุปเหตุการณ์ socket
connect
: การเชื่อมต่อกับเซิร์ฟเวอร์ทริกเกอร์data
สำเร็จ : รับพารามิเตอร์ที่ส่งโดยend
เซิร์ฟเวอร์ : หลังจากได้รับข้อมูลแล้ว ก็สามารถทริกเกอร์close
: การปิดซ็อกเก็ตจะทริกเกอร์กรอบงาน service.js
และ client.js
ได้รับการเขียนแล้ว เรียกใช้หลังจากเปิดเทอร์มินัลสองเครื่อง:
node service.js node client.js
สามารถตรวจสอบผลลัพธ์ที่พิมพ์ออกมาได้ด้วยตัวเอง
โดยทั่วไปแล้ว การผลิตจริงยังต้องจัดการกับแพ็กเก็ตเหนียว การแกะกล่อง/บรรจุภัณฑ์ แพ็กเก็ตฮาร์ทบีทด้วย เป็นต้น
บทความนี้คัดลอกมาจาก: https://juejin.cn/post/7084618854801866765
ผู้แต่ง: ฉันชื่อส้มน้อย