0Pricing
JavaScript Academy · บทเรียน

การส่งและรับข้อความ

แลกเปลี่ยนข้อมูลด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเปิดการเชื่อมต่อ WebSocket
  2. การส่งและรับข้อความ
  3. วงจรชีวิตและข้อผิดพลาดของการเชื่อมต่อ
  4. กลยุทธ์การเชื่อมต่อใหม่
← กลับไปที่ JavaScript Academy