HTML5 WebSocket
WebSocket は HTML5 から提供されている、単一の TCP 連続接続上で双方向通信を行うことができるプロトコルです。
WebSocketの特徴と利点
WebSocket により、クライアントとサーバー間のデータ交換が非常に簡単になり、サーバーがクライアントにデータをプッシュすることができます。
WebSocket API を使用するだけで、ブラウザとサーバーは接続時に一度だけハンドシェイクを行い、その後は持続的な接続が可能になり、双方向でデータをやり取りすることができます。
従来の Ajax ポーリングを使ったプッシュ技術とは違い、WebSocket では不必要な HTTP ヘッダが削減され、通信の効率が向上します。
WebSocket APIによる接続
ブラウザは JavaScript を使用し、サーバーに WebSocket 接続要求を送信します。接続が確立されると、クライアントとサーバーが TCP 接続を通じて直接データを交換できるようになります。
以下のように WebSocket オブジェクトを作成することで接続を確立します:
var socket = new WebSocket(url, [protocol]);
パラメータ説明:
- url: 接続する URL を指定します。
- protocol: 任意のパラメータで、受け入れ可能なサブプロトコルを指定します。
WebSocketの属性
以下は WebSocket オブジェクトの属性です。Socket オブジェクトを使ってプロパティを参照します:
属性 | 説明 |
---|---|
Socket.readyState | 接続状態を示す読み取り専用の属性です。値は以下のいずれかです:
|
Socket.bufferedAmount | 送信待ちのデータ量を表す読み取り専用の属性です。 |
WebSocketのイベント
イベント | イベントハンドラ | 説明 |
---|---|---|
open | Socket.onopen | 接続が確立された時に発生します。 |
message | Socket.onmessage | クライアントがサーバーからデータを受信した時に発生します。 |
error | Socket.onerror | 通信エラーが発生した時に発生します。 |
close | Socket.onclose | 接続が閉じられた時に発生します。 |
WebSocketのメソッド
メソッド | 説明 |
---|---|
Socket.send() | データを送信します。 |
Socket.close() | 接続を閉じます。 |
WebSocketのコード例:チャットアプリケーション
この例では、WebSocketを使ってシンプルなチャットアプリケーションを作成します。ユーザーはメッセージを入力して送信し、サーバーは接続しているすべてのクライアントにそのメッセージをブロードキャストします。
サーバー側 (Node.js):
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) {
console.log('新しいクライアントが接続しました。');
ws.on('message', function incoming(message) {
console.log('受信したメッセージ: %s', message);
// 接続しているすべてのクライアントにメッセージをブロードキャスト
wss.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
ws.send('サーバーに接続しました。');
});
クライアント側 (HTML/JavaScript):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WebSocketチャット</title>
</head>
<body>
<h1>チャットルーム</h1>
<div id="chatbox">
</div>
<input type="text" id="message">
<button onclick="sendMessage()">送信</button>
<script>
const ws = new WebSocket('ws://localhost:8080');
ws.onopen = function(event) {
console.log('サーバーに接続しました。');
};
ws.onmessage = function(event) {
const message = event.data;
const chatbox = document.getElementById('chatbox');
const newMessage = document.createElement('p');
newMessage.textContent = message;
chatbox.appendChild(newMessage);
};
function sendMessage() {
const messageInput = document.getElementById('message');
const message = messageInput.value;
ws.send(message);
messageInput.value = '';
}
</script>
</body>
</html>
説明:
-
サーバー側:
-
wsモジュールを使ってWebSocketサーバーを作成します。
-
connectionイベントで新しいクライアントの接続を待ち受けます。
-
messageイベントでクライアントから送信されたメッセージを受信します。
-
受信したメッセージを、接続しているすべてのクライアントにブロードキャストします。
-
-
クライアント側:
-
WebSocketオブジェクトを作成し、サーバーに接続します。
-
onopenイベントで接続が確立されたことを確認します。
-
onmessageイベントでサーバーから送信されたメッセージを受信し、チャットボックスに表示します。
-
sendMessage関数は、ユーザーがメッセージを送信する際に呼び出され、メッセージをサーバーに送信します。
-
実行方法:
-
Node.jsをインストールします。
-
プロジェクトフォルダを作成し、server.jsという名前でサーバー側のコードを保存します。
-
同じフォルダにindex.htmlという名前でクライアント側のコードを保存します。
-
ターミナルでプロジェクトフォルダに移動し、node server.jsを実行してサーバーを起動します。
-
ブラウザでhttp://localhost:8080にアクセスします。
参考文献と関連QA
WebSocket はどのようにブラウザとサーバー間の通信効率を向上させますか?
WebSocket は持続可能な TCP 接続を使用してヘッダのオーバーヘッドを削減し、リアルタイムの双方向通信を可能にします。
WebSocket の接続状態を確認するにはどうすればよいですか?
WebSocket オブジェクトの readyState 属性を使用します。これにより接続状態を数値で確認できます。
WebSocket 接続が閉じたときの処理はどうすればよいですか?
Socket.onclose イベントハンドラを使用して、接続が閉じたときの処理を定義します。