はじめに
Node.js で下記の ws を使い、でシンプルな WebSocketサーバーを使う時の話です。
過去にも、その内容の記事を書いていたのですが、今回は Bufferオブジェクトで受けとった文字列を扱う話に関わる、シンプルな内容です。
●ws - npm
https://www.npmjs.com/package/ws
背景の補足
とあるハッカソンで、WebSocket を使った PC とスマホ・ガジェット等を連動させる通信処理を実装しようとした時に、特定の複数の文字列をキーに、複数の動作を行わせることをやろうとしました。
そのテスト実装をした時、「文字列を送信する側が Bufferオブジェクトでデータを送る形」で、「受信側では、文字列変換した内容を扱いたい」という状況があってやった内容です。
実装内容
以下が本題です
今回、以下では、WebSocketサーバーの機能がある受信側の実装(かなりシンプルなもの)を示します。
npm i ws
でパッケージをインストールして、下記のプログラムを作り、nodeコマンドで動かします(接続は、例えば localhost のポート番号 8080 になる形)。
const WebSocket = require("ws");
const wss = new WebSocket.Server({ port: 8080 });
wss.on("connection", (ws) => {
console.log("クライアントが接続しました");
ws.on("message", (message) => {
// console.log("受信したメッセージ:", message);
// 受信したBufferをUTF-8で文字列に変換
const textMessage = message.toString("utf-8");
console.log("受信したメッセージ:", textMessage);
});
ws.on("close", () => {
console.log("クライアントが切断されました");
});
});
console.log("WebSocketサーバーがポート8080で稼働中...");
const textMessage = message.toString("utf-8");
という部分の中で、「toString()」を使った UTF-8 の文字列への変換がポイントです。
●Object.prototype.toString() - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
上記のコードでコメントアウトしている // console.log("受信したメッセージ:", message);
を有効にして、送信側から「1」という文字列を Bufferオブジェクトで送った時の出力が以下となります。
出力を見ると、受けとった Bufferオブジェクトがそのまま出力された後、文字列に変換された後の出力も行われていること(UTF-8 で数字の「1」を示す「31」と、toString() で処理した後の文字列「1」が出力されていること)が確認できました。