การส่งและรับข้อความ
แลกเปลี่ยนข้อมูลด้วย send และ onmessage
การส่งและรับข้อความ เป็นบทเรียน JavaScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน JavaScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
การส่งข้อความ
เมื่อเปิดการเชื่อมต่อแล้ว socket.send(string) จะส่งข้อความไปยังเซิร์ฟเวอร์
socket.onopen = () => {
socket.send("ping");
};การรับข้อมูลด้วย onmessage
onmessage จะทำงานกับทุกเฟรมขาเข้า ข้อมูลจะอยู่ใน event.data
socket.onmessage = (event) => {
console.log("Received:", event.data);
};การจัดกรอบข้อมูล JSON
WebSockets ส่งผ่านสตริงดิบ หากต้องการส่งข้อมูลที่มีโครงสร้าง ให้แปลงเป็นสตริงด้วย JSON.stringify แล้วแยกวิเคราะห์เมื่อได้รับข้อมูล
socket.send(JSON.stringify({ type: "chat", text: "hi" }));
socket.onmessage = (e) => {
const msg = JSON.parse(e.data);
console.log(msg.type, msg.text);
};การส่งต่อข้อความตามประเภท
รูปแบบที่ใช้กันทั่วไปคือ เพิ่มฟิลด์ type แล้วส่งต่อการประมวลผลตามค่าของฟิลด์นั้น
socket.onmessage = (e) => {
const msg = JSON.parse(e.data);
switch (msg.type) {
case "chat": showChat(msg); break;
case "presence": updatePresence(msg); break;
}
};การส่งข้อมูลไบนารี
send ยังรับ ArrayBuffer อาร์เรย์แบบมีชนิดข้อมูล และ Blob สำหรับข้อมูลไบนารีได้ด้วย
const bytes = new Uint8Array([1, 2, 3, 4]);
socket.send(bytes.buffer);การรับข้อมูลไบนารี
เมื่อใช้ binaryType = "arraybuffer" ค่า event.data จะเป็น ArrayBuffer ที่คุณนำไปห่อหุ้มด้วยอาร์เรย์แบบมีชนิดข้อมูลได้
socket.binaryType = "arraybuffer";
socket.onmessage = (e) => {
if (e.data instanceof ArrayBuffer) {
const view = new Uint8Array(e.data);
console.log(view.length);
}
};การควบคุมแรงดันย้อนกลับด้วย bufferedAmount
bufferedAmount รายงานจำนวน bytes ที่เข้าคิวไว้แต่ยังไม่ได้ส่ง ควรตรวจสอบค่านี้ก่อนส่งข้อมูลจำนวนมากเข้าสู่ซ็อกเก็ต เพื่อป้องกันการใช้หน่วยความจำเพิ่มขึ้นอย่างไร้ขอบเขต
if (socket.bufferedAmount < 1_000_000) {
socket.send(payload);
}สัญญาณชีพ
ส่งข้อความ ping เป็นระยะ เพื่อให้ทั้งสองฝ่ายทราบว่าการเชื่อมต่อยังทำงานอยู่ และป้องกันไม่ให้ตัวกลางปิดการเชื่อมต่อที่ไม่มีการใช้งาน
setInterval(() => {
if (socket.readyState === WebSocket.OPEN) {
socket.send(JSON.stringify({ type: "ping" }));
}
}, 30000);คำขอและการตอบกลับผ่าน WebSocket
ใส่รหัสกำกับข้อความขาออก แล้วทำให้พรอมิสที่เป็น pending เสร็จสมบูรณ์เมื่อได้รับคำตอบที่ตรงกัน
const pending = new Map();
function request(payload) {
const id = crypto.randomUUID();
socket.send(JSON.stringify({ id, ...payload }));
return new Promise((res) => pending.set(id, res));
}
socket.onmessage = (e) => {
const msg = JSON.parse(e.data);
if (pending.has(msg.id)) { pending.get(msg.id)(msg); pending.delete(msg.id); }
};การเข้าคิวก่อนเปิดการเชื่อมต่อ
หากอาจมีการส่งข้อมูลก่อนซ็อกเก็ตเปิด ให้เก็บข้อความไว้ในบัฟเฟอร์ แล้วส่งออกทั้งหมดใน onopen
const queue = [];
function safeSend(data) {
if (socket.readyState === WebSocket.OPEN) socket.send(data);
else queue.push(data);
}
socket.onopen = () => { queue.forEach((d) => socket.send(d)); queue.length = 0; };การตรวจสอบข้อมูลขาเข้า
อย่าเชื่อถือข้อมูลจากช่องทางส่งข้อมูลโดยอัตโนมัติ ให้ครอบ JSON.parse ด้วย try/catch และตรวจสอบโครงสร้างก่อนนำไปใช้
socket.onmessage = (e) => {
let msg;
try { msg = JSON.parse(e.data); }
catch { return; }
if (typeof msg.type !== "string") return;
handle(msg);
};ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบการรับส่งข้อความ
ทบทวน: การส่งและรับข้อมูล
คุณส่งข้อมูลทั้งแบบข้อความและไบนารี จัดการ onmessage จัดกรอบข้อมูลเป็น JSON ส่งต่อข้อมูลตามประเภท ตรวจสอบ bufferedAmount เพื่อควบคุมแรงดันย้อนกลับ เพิ่มสัญญาณชีพ และเข้าคิวข้อความก่อนซ็อกเก็ตจะเปิดแล้ว ต่อไป: วงจรชีวิตของการเชื่อมต่อ
คำถามที่พบบ่อย
บทเรียน “การส่งและรับข้อความ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การส่งและรับข้อความ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส JavaScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การส่งและรับข้อความ”
แลกเปลี่ยนข้อมูลด้วย send และ onmessage คุณปฏิบัติ JavaScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน JavaScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน JavaScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การส่งและรับข้อความ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน JavaScript Academy นี้ได้ไหม
ได้ บทเรียน JavaScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเปิดการเชื่อมต่อ WebSocket
- การส่งและรับข้อความ
- วงจรชีวิตและข้อผิดพลาดของการเชื่อมต่อ
- กลยุทธ์การเชื่อมต่อใหม่