チャットアプリ開発に見る、Socket.IOの基本ライブラリの使い方Socket.IOで始めるWebSocket超入門(2)(2/3 ページ)

» 2016年04月28日 05時00分 公開
[猪熊朔也三菱総研DCS]

双方向通信の実装(データの送受信)

 次に、双方向通信によるデータ送受信の実装についてです。ひな型の処理の流れに沿って説明します。ポイントは、emitは送信、onは受信ということです。

データの送信 データの受信
emit(送信イベント名, 送信データ) 関数 on(受信イベント名, 受信データ) 関数

クライアントからサーバへのデータ送信

  1. $("form").submit(function(e){
  2. var message = $("#msgForm").val();
  3. $("#msgForm").val('');
  4. // C03. client_to_serverイベント・データを送信する
  5. socket.emit("client_to_server", {value : message});
  6. e.preventDefault();
  7. });
index.html
  • C03. client_to_serverイベント・データを送信する

 フォームがsubmitされたら入力値を取得し、その値をclient_to_serverイベントとしてサーバへ送信しています。

サーバでのデータ受信とクライアントへのデータ送信

  1. // S04. connectionイベント・データを受信する
  2. io.sockets.on('connection', function(socket) {
  3. // S05. client_to_serverイベント・データを受信する
  4. socket.on('client_to_server', function(data) {
  5. // S06. server_to_clientイベント・データを送信する
  6. io.sockets.emit('server_to_client', {value : data.value});
  7. });
  8. });
app.js
  • S04. connectionイベント・データを受信する

 クライアント~サーバ間でWebSocket通信が確立すると、io.socketsオブジェクトに対してconnectionイベントが発火(データが送信)されます。このconnectionイベントはWebSocket通信が確立している限り有効です。そのため、connectionイベント受信時のコールバック関数として、必要なサーバサイドの処理を定義することになります。

io.sockets.on('connection', function(socket) {
    // この中に必要な処理を記述する
});
  • S05. client_to_serverイベント・データを受信する

 クライアントから送信されたclient_to_serverイベントとデータを受信しています。

  • S06. server_to_clientイベント・データを送信する

 受信したデータをserver_to_clientイベントとして、接続している全クライアントへ送信しています。全クライアントにデータを送信するには、「io.sockets.emit(送信イベント名, 送信データ)」を使用します。

        io.sockets.emit('server_to_client', {value : data.value});

クライアントでのデータ受信

  1. // C04. server_to_clientイベント・データを受信する
  2. socket.on("server_to_client", function(data){appendMsg(data.value)});
  3. function appendMsg(text) {
  4. $("#chatLogs").append("<div>" + text + "</div>");
  5. }index.html
  • C04. server_to_clientイベント・データを受信する

 サーバから送信されたserver_to_clientイベントを受信し、データを取得します。コールバック関数(appendMsg(text))で、チャットログエリアにデータを表示します。

 以上が、クライアント~サーバ間での双方向通信の実装です。emit/onを交互に使用してデータをやりとりしていることが確認できたと思います。

その他のデータ送信方法

 Socket.IOサーバライブラリには、全クライアントにデータを送信する「io.sockets.emit(送信イベント名, 送信データ)」だけではなく、他にもデータ送信用ライブラリが存在します。

ブロードキャスト送信

 まずは、「socket.broadcast.emit(送信イベント名, 送信データ)」です。このライブラリを使用すると、サーバは、データ・イベントを送信したクライアント以外の全てのクライアントにデータを送信します。

ブロードキャスト送信概要図

 では、実際にコードを追加・変更しながら処理の違いを確認してみましょう。ユーザーが入室したら、他のクライアントにだけ入室メッセージ表示する処理を実装します。

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>websocket-chat</title>
  6. <link rel="stylesheet"
  7. href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
  8. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
  9. <!-- C01. Socket.IOクライアントライブラリの読み込み -->
  10. <script type="text/javascript" src="/socket.io/socket.io.js"></script>
  11. </head>
  12. <body>
  13. <div class="container">
  14. <h1>WebSocket-Chat</h1>
  15. <form class="form-inline">
  16. <div class="form-group">
  17. <label for="msgForm">名前:</label>
  18. <input type="text" class="form-control" id="msgForm">
  19. </div>
  20. <button type="submit" class="btn btn-primary" id="sendButton">入室</button>
  21. </form>
  22. <div id="chatLogs"></div>
  23. </div>
  24. <script type="text/javascript">
  25. var socket = io.connect(); // C02. ソケットへの接続
  26. var isEnter = false;
  27. var name = '';
  28. // C04. server_to_clientイベント・データを受信する
  29. socket.on("server_to_client", function(data){appendMsg(data.value)});
  30. function appendMsg(text) {
  31. $("#chatLogs").append("<div>" + text + "</div>");
  32. }
  33. $("form").submit(function(e){
  34. var message = $("#msgForm").val();
  35. $("#msgForm").val('');
  36. if (isEnter) {
  37. message = "[" + name + "]: " + message;
  38. // C03. client_to_serverイベント・データを送信する
  39. socket.emit("client_to_server", {value : message});
  40. } else {
  41. name = message;
  42. var entryMessage = name + "さんが入室しました。";
  43. // C05. client_to_server_broadcastイベント・データを送信する
  44. socket.emit("client_to_server_broadcast", {value : entryMessage});
  45. changeLabel();
  46. }
  47. e.preventDefault();
  48. });
  49. function changeLabel() {
  50. $("label").text("メッセージ:");
  51. $("button").text("送信");
  52. isEnter = true;
  53. }
  54. </script>
  55. </body>
  56. </html>
index.html(17、20、27、28、40~50、54~58行目が追加・変更部分)
  • C05. client_to_server_broadcastイベント・データを送信する

 “~さんが入室しました。”というメッセージをサーバに送信するclient_to_server_broadcastイベントを新しく追加しています。

  1. // S01. 必要なモジュールを読み込む
  2. var http = require('http');
  3. var socketio = require('socket.io');
  4. var fs = require('fs');
  5. // S02. HTTPサーバを生成する
  6. var server = http.createServer(function(req, res) {
  7. res.writeHead(200, {'Content-Type' : 'text/html'});
  8. res.end(fs.readFileSync(__dirname + '/index.html', 'utf-8'));
  9. }).listen(3000); // ポート競合の場合は値を変更
  10. // S03. HTTPサーバにソケットをひも付ける(WebSocket有効化)
  11. var io = socketio.listen(server);
  12. // S04. connectionイベント・データを受信する
  13. io.sockets.on('connection', function(socket) {
  14. // S05. client_to_serverイベント・データを受信する
  15. socket.on('client_to_server', function(data) {
  16. // S06. server_to_clientイベント・データを送信する
  17. io.sockets.emit('server_to_client', {value : data.value});
  18. });
  19. // S07. client_to_server_broadcastイベント・データを受信し、送信元以外に送信する
  20. socket.on('client_to_server_broadcast', function(data) {
  21. socket.broadcast.emit('server_to_client', {value : data.value});
  22. });
  23. });
app.js(21~24行目が追加・変更部分)
  • S07. client_to_server_broadcastイベント・データを受信し、送信元以外に送信する

 client_to_server_broadcastイベントより取得した入室メッセージをクライアントに送信する処理を追加しています。

 コードの変更・保存が完了したら、アプリケーションの動作を確認します。ターミナルで、websocket-chatディレクトリに移動し、「node app.js」コマンドを実行してください(既に実行中の場合は、1度停止した後に再度実行してください)。その後、ブラウザウィンドウを複数開き、「http://localhost:3000/」にアクセスしてみましょう。

ブロードキャスト送信動作確認【1】

 どれか1つのウィンドウで、名前欄に値を入力し、入室ボタンを押下します。

ブロードキャスト送信動作確認【2】

 ボタン押下後、入力ウィンドウ以外に、「~さんが入室しました。」というメッセージが表示されていることが確認できたと思います。

 このように、broadcastを利用すると、自分以外の全てのクライアントにメッセージを送信できます。

        socket.broadcast.emit('server_to_client', {value : data.value});

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

HTML5�ス蛛スX 髫ェ蛟�スコ荵斟帷ケ晢スウ郢ァ�ュ郢晢スウ郢ァ�ー

隴幢スャ隴鯉ス・隴帷」ッ菫」

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。