ホームに戻る
 Node.js と JavaScriptクライアントで WebSocket通信

0、はじめに

まずそれぞれに何ができるか?を書きます。

Node.js は JavaScript で記述できるサーバーです。
linux に nodejs をインストールし、

nodejs server.js

とすると起動できます。

JavaScript は言うまでもありませんが、
ブラウザ上で動的な処理を行うときに使用します。

WebSocket は TCP/IP 上のプロトコルで、
Node.jsサーバー と JavaScriptクライアントで通信を可能にします。

これらを組み合わせることによって、
Webサービスやオンラインゲームなどに利用できます。

今回作ったサンプルはクラアントからの送信をサーバーが受け、
サーバーがクライアントに結果を返し結果をクライアントが表示します。
複数のブラウザからクライアントを起動し、
サーバーの表示やクライアントの表示を読むと、
挙動がよくわかると思います。

1、Node.js の準備

まず linux で node.js をインストールします。
apt-get などでインストールできると思います。
インストールするときの名前は、
node.js では無く nodejs なので注意します。
(場合によっては nodejs で無く node の場合もあるようです。)

nodejs -v

でバージョンが表示されればインストール完了です。

例えば、下のようなコードを書いて、

nodejs Sample.js

としてサーバーを起動し http://127.0.0.1:8080/ にアクセスすれば、
「Hello World!」がブラウザに表示されるはずです。
(IPアドレスとポート番号は必要に応じて書き換えてください。)

// Sample.js
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World!\n');
}).listen(8080, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8080/');

2、JavaScript の準備

JavaScript はほとんどのブラウザで標準で使用できます。
特に何かを準備するということはありません。

3、WebSocket の準備

WebSocket は npm を使ってインストールします。
npm は apt-get などでインストールできると思います。
npm は node.js のパッケージの管理を行います。
まず、npm をインストールしたら、

npm install socket.io

として WebSocket をインストールします。

4、通信の基礎

通信する際には、

IPアドレスとポート番号が必要です。

IPアドレスはPCごとに割り振られています。
ポート番号はそれぞれのPCで共通でなければいけません。

linux の場合、ifconfig で調べることができます。
Windows の場合、コマンドラインから ipconfig で調べることができます。

ping *.*.*.*

などとすると通信が確立されているか調べることができます。
(*.*.*.* は相手のIPアドレス。)

5、JSON について

JSON は JavaScript のオブジェクトを文字列に変換します。
JavaScript はオブジェクトを、

var obj = {text:'abc', num:123};

などと書きますがこのままのデータを飛ばせません、
よって JSON と呼ばれるフォーマットに置き換えます。

var data = JSON.stringify(obj);

とするとオブジェクトを文字列に変換します。
逆に、

var obj = JSON.parse(data);

とするとオブジェクトに変換します。

6、Node.js サーバー

接続順に番号を割り振ります。
クライアントから受信したデータは、
すべてクライアントに返します。

// Node.js サーバー のサンプル
// ポート番号は 8080 になっています。

var ws = require('websocket.io');

var server = ws.listen(8080, function(){
  console.log('Server is running.');
});

var n = 0;

server.on('connection', function(socket) {
  socket.on('message', function(data) {
    var data = JSON.parse(data);
    if(data.type == 'open'){
      n = n + 1;
      data.num = n;
    }

    data = JSON.stringify(data);
    console.log('\033[96m' + data + '\033[39m');

    for(var i = 0; i < server.clients.length; i++){
      server.clients[i].send(data);
    }
  });
});

7、JavaScriptクライアント

JavaScript は HTML に埋め込みです。
jQuery を使用しています。
IPアドレスとポート番号を書き換えて使用してください。
フォームに文字を書いて send ボタンを押すと送信です。
受信した結果はフォームの上のテキストです。

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
  <script>
  $(function(){
    var n = 0;
    var host = "ws://127.0.0.1:8080/";
    var socket = new WebSocket(host);

    socket.onopen = function(){
      socket.send(JSON.stringify({
        type: 'open',
        num: n
      }));
    }
    socket.onmessage = function(message){
      var data = JSON.parse(message.data);
      if(data.type == 'open' && n == 0){
        n = data.num;
      }
      document.getElementById('r_data').innerHTML = n + ":" + data.type;
    }
    socket.onclose = function(){
      socket.send(JSON.stringify({
        type: 'close',
        num: n
      }));
    }
    $(window).unload(function() {
      socket.onclose();
    })
    $("#sendButton").on("click",function(){
      message = $("#message").val()
      socket.send(JSON.stringify({
        type: 'send' + ' (' + n + ':' + message + ')',
        num: n
      }));
    });
  })
  </script>
</head>
<body>
  <h1><font id="r_data">open error</font></h1>  
  <input type="text" id="message"/><button id="sendButton">send</button>
</body>
</html>

inserted by FC2 system