0Pricing
JavaScript Academy · レッスン

メッセージを送受信する

send と onmessage でデータをやり取りします。

「メッセージを送受信する」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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によるフレーミング

WebSocketが転送するのは生の文字列です。構造化データを送信するには、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は、キューに入り、まだ送信されていないバイト数を示します。ソケットへの過剰な送信によるメモリの際限ない増加を防ぐため、送信前に確認してください。

if (socket.bufferedAmount < 1_000_000) {
  socket.send(payload);
}

ハートビート

定期的にpingメッセージを送信すると、双方が接続の存続を確認でき、仲介者によってアイドル状態の接続が閉じられるのを防げます。

setInterval(() => {
  if (socket.readyState === WebSocket.OPEN) {
    socket.send(JSON.stringify({ type: "ping" }));
  }
}, 30000);

WebSocket上のリクエストとレスポンス

送信メッセージにIDを付け、対応する返信が届いたときに保留中のPromiseを解決します。

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でバックプレッシャーを監視し、ハートビートを追加し、ソケットが開く前のメッセージをキューに入れました。次は接続のライフサイクルです。

よくある質問

「メッセージを送受信する」レッスンは無料ですか?

はい。「メッセージを送受信する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全4レッスンが含まれています。

「メッセージを送受信する」で何を学びますか?

send と onmessage でデータをやり取りします。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

JavaScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「メッセージを送受信する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJavaScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. WebSocket 接続を開く
  2. メッセージを送受信する
  3. 接続のライフサイクルとエラー
  4. 再接続戦略
← JavaScript Academyに戻る