WebSocketは、クライアントとサーバー間の双方向通信を可能にするリアルタイム通信プロトコルであり、低遅延かつ高頻度のデータ更新が必要なアプリケーションに適しています。
WebSocketは、単一のTCP接続上での全二重通信のためのプロトコルです。クライアントとサーバー間に持続的な接続を確立し、双方向のリアルタイム通信を可能にします。WebSocketはHTTPプロトコルを使用してハンドシェイクを開始し、その後WebSocket接続にアップグレードされ、両者が直接データを送信できるようになります。この持続的な接続により、通信オーバーヘッドが削減され、サーバーはクライアントに対して積極的にデータをプッシュできるようになり、頻繁なクライアント主導のリクエストが不要になります。
全体として、WebSocketのネットワークリソースの効率的な利用、遅延の削減、リアルタイムの双方向通信のサポートにより、さまざまなウェブベースのアプリケーションにおけるネットワーク最適化のための貴重なツールとなっています。
WebSocketは、低遅延かつ高頻度のデータ更新が必要なリアルタイムアプリケーションやサービスに使用されます。特に、リアルタイムチャット、オンラインゲーム、ライブスポーツ更新、金融取引プラットフォーム、共同編集ツールなどのアプリケーションに役立ちます。WebSocketは、従来のHTTPに比べてクライアントとサーバー間のより迅速かつ効率的な双方向通信を可能にし、これらのタイプのユースケースに特に適しています。
const WebSocket = require('ws');
const wsk = new WebSocket.Server({ port: 8080 });
wsk.on('connection', ws => {
ws.on('message', message => {
console.log('クライアントから受信したメッセージ: %s', message);
// クライアントメッセージに返信
ws.send(`私はサーバーで、あなたから受け取ったメッセージは: ${message} です`);
});
ws.on('close', () => {
console.log('クライアントが切断されました');
});
// WebSocket接続を作成
var socket = new WebSocket("ws://localhost:8080");
// 接続が開かれたときに行うこと
socket.onopen = function(event) {
console.log("接続が開かれました");
// 初期化メッセージを送信
socket.send("私はクライアントで接続しました!");
};
// サーバーデータを受信したときに行うこと
socket.onmessage = function(event) {
console.log("サーバーから受信したデータ: " + event.data);
};
// 接続が閉じられたときに行うこと
socket.onclose = function(event) {
console.log("接続が閉じられました");
};
// 接続エラーを処理する方法
socket.onerror = function(error) {
console.log("エラーが発生しました: " + error);
}
JavaScriptを使用したフロントエンド開発に加えて、Java、C++、Go、Python、PHP、Rustなどのプログラミング言語プラットフォームでもWebSocketを使用できます。
以下は、典型的なWebSocketハンドシェイクリクエストの例です:
GET /chat HTTP/1.1 // /chatエンドポイントへのGETリクエスト。
Host: example.com:8000 // WebSocketサーバーのドメインとポート。
Upgrade: websocket // クライアントがアップグレードしたいプロトコル。
Connection: Upgrade // クライアントが既存の接続を使用するのではなく、新しい接続を確立したいことをサーバーに伝える。
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== // サーバーがこの要求を受け取ったことを証明するために、サーバーがデコードし、ハッシュ化して送り返すBase64エンコードされたランダム値。
Origin: http://example.com // クライアントリクエストの起源。
Sec-WebSocket-Protocol: chat, superchat // 接続を作成するアプリケーションによって使用されるサブプロトコルを指定。
Sec-WebSocket-Version: 13 // クライアントが使用したいWebSocketプロトコルのバージョン。
ハンドシェイクリクエストに対するサーバーの応答は以下の通りです:
HTTP/1.1 101 Switching Protocols // リクエスト通りプロトコルが切り替えられることを示す。
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= // 初期ハンドシェイクで送信されたSec-WebSocket-Keyを特定のGUIDと組み合わせてハッシュ化したもの。クライアントはこれを使用してサーバーがハンドシェイクを受け取ったことを確認できます。
EdgeOneは、サーバーがクライアントにデータを積極的に送信できるWebSocketプロトコルをサポートしています。WebSocketは、単一のTCP接続を介して双方向通信チャネルを提供し、リアルタイムデータ交換を可能にします。これは、インタラクティブなゲーム、ライブチャット、共同文書など、リアルタイムの相互作用が必要なアプリケーションに特に有益です。