[node] Socket.IOを使ったチャットアプリ。インストールから実装まで。
4月はnode.jsを使い倒すという目標のもと、
node.jsをインストールしたら、さっそく個人的に大注目しているSocket.IOを
用いたリアルタイムWebの構築をしてみました。
今日はとっても定番と言われているチャットアプリです。 その環境構築から、実装内容までブログに書きたいと思います。
メッセージ送信と名前送信をすることが出来ます。
メッセージ送信は、送った内容が自分も含め接続しているユーザー全員に送信されます。
名前送信は、自分以外の全ユーザーに送信されます。
以下が構成イメージです。
socket.ioも負けず劣らず簡単にインストール出来ます。今回は、MacとかLinuxのやり方です。
以下のコマンドを実行することでsocket.ioがインストールされます。
npmの動きの正確な情報はこれから勉強します。。
とりあえずこれでインストール完了。
WebServerでアクセスされたら、index.htmlを返し、index.html(クライアント側)と Socket.IOの実装をしたサーバー側が会話をする形式です。
今回は以下の実装をchat.jsというファイル名で保存しました。
Socket.IOは、ver6系とver7系以降で、実装がかなり変わっているようです。
上記はver7系以降の実装です。
メッセージを送る機能と挨拶をする2つの機能があります。
JavaScriptを読み込み時点で、サーバーにコネクションを貼り、 各機能のボタンを押す事で、サーバーにメッセージが送信されます。
またサーバーからメッセージを受信したら、即座にメッセージを画面に表示します。
以下はindex.htmlの内容です。
Socket.IO API 解説
socket.io/#how-to-use
Socket.IOはドキュメントもまだあまり整備されていないようなので、 バリバリソースコードを読んでいき、良き情報はアウトプットしたいと思います!!
最後までお読み頂きましてありがとうございました!!
今日はとっても定番と言われているチャットアプリです。 その環境構築から、実装内容までブログに書きたいと思います。
こんなサンプルアプリを作りました
機能としては、「http://localhost:8080/」にアクセスすると、Socket.IOのサーバーに接続されます。メッセージ送信と名前送信をすることが出来ます。
メッセージ送信は、送った内容が自分も含め接続しているユーザー全員に送信されます。
名前送信は、自分以外の全ユーザーに送信されます。
以下が構成イメージです。
まずは導入から
node.jsは導入済みの前提で、socket.ioのインストールを行います。 node.jsのインストールは(node.js始めました!とっても簡単なインストール編)を 参照ください。socket.ioも負けず劣らず簡単にインストール出来ます。今回は、MacとかLinuxのやり方です。
以下のコマンドを実行することでsocket.ioがインストールされます。
npm install socket.ioこれで、npmを実行したディレクトリに、「node_modules」というディレクトリができるようです。
npmの動きの正確な情報はこれから勉強します。。
とりあえずこれでインストール完了。
早速実装します(サーバー編)
サーバー側での実装は、以下のように行いました。WebServerでアクセスされたら、index.htmlを返し、index.html(クライアント側)と Socket.IOの実装をしたサーバー側が会話をする形式です。
今回は以下の実装をchat.jsというファイル名で保存しました。
// 必要なモジュールをインポートする var http = require("http"); var socketIO = require("socket.io"); var fs = require("fs"); // Webサーバーを構築し、アクセスされたらindex.htmlファイルを返す var server = http.createServer(function(req, res) { res.writeHead(200, {"Content-Type" : "text/html"}); var output = fs.readFileSync("./index.html", "utf-8"); res.end(output); }); // ポートは8080で待ち受ける server.listen(8080); // Socket.IOサーバーを構築する var io = socketIO.listen(server); io.sockets.on("connection", function (socket) { console.log("connected"); // メッセージを受け取った時の動作 socket.on("message", function (data) { console.log("message: " + data.value); // 全員に受け取ったメッセージを送る io.sockets.emit("message", {value: data.value}); }); // "say hello"というカスタムイベントを受け取った時の動作 // connection, message, disconnectといった定義済みイベント // 以外に自由にイベント名を定義できる // そのイベント名はサーバーとクライアントで合わせればOK socket.on("say hello", function (data) { console.log("userName=" + data.userName); // メッセージ送信者以外に送る(ブロードキャストという) socket.broadcast.emit("message", {value : "Hello! This is " + data.userName + "."}); }); // 誰かがコネクションを切った得の動作 // 例えばブラウザを閉じた時とか socket.on("disconnect", function () { // 全ユーザーにメッセージを送る io.sockets.emit("message", {value:"user disconnected"}); }); });
Socket.IOは、ver6系とver7系以降で、実装がかなり変わっているようです。
上記はver7系以降の実装です。
続いて実装します(クライアント編)
クライアント側の実装を行います。メッセージを送る機能と挨拶をする2つの機能があります。
JavaScriptを読み込み時点で、サーバーにコネクションを貼り、 各機能のボタンを押す事で、サーバーにメッセージが送信されます。
またサーバーからメッセージを受信したら、即座にメッセージを画面に表示します。
以下はindex.htmlの内容です。
<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title>Chatroom</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script> <!-- Socket.IOのJSファイルをインポートする --> <script src="http://localhost:8080/socket.io/socket.io.js"></script> <script type="text/javascript"> // Socket.IO Serverに接続する var socket = io.connect("http://localhost:8080"); // 接続時のイベント socket.on("connect", function () { console.log("client: connect"); }); // サーバーからメッセージを受け取った時のイベント socket.on("message", function (message) { // 画面にメッセージを表示する appendMessage(message.value); }); // サーバーから誰かが接続解除したメッセージを受け取った時のイベント socket.on("disconnect", function (client) { console.log(client.sessionId + " disconnected."); }); // サーバーにメッセージを送信する機能 function sendMessage () { var msg = $("input#message").val(); $("input#message").val(""); if (msg.length > 0) { // サーバーにメッセージを送る // 第2引数でサーバーへ内容を送ることができる socket.emit("message", {value:msg}) } } // 挨拶を送る機能 // カスタムイベント"say hello"を利用している。 function sayHello () { var userName = $("#text_userName").val(); if (userName.length > 0) socket.emit("say hello", {userName:userName}); } // divAreaにメッセージを表示する function appendMessage (message) { $("div#chat-box").append("<div class='msg'>" + message + "</div>"); } </script> </head> <body> <!-- Sending Message Function --> <form action="" method="post" onsubmit="return false;"> <input type="text" name="message" id="message" value="" style="width:200px;"/> <input type="submit" class="button" name="send" id="send" value="Send" onclick="sendMessage();"/> </form> <!-- Greeting Function --> <form action="" method="post" onsubmit="return false;"> <input type="text" name="userName" id="text_userName" value="" placeholder="please put your name." style="width:200px;"/> <input type="submit" class="button" name="hello" id="greeting" value="Greeting" onclick="sayHello();"/> </form> <br> <!-- the Area of showing message from other users. --> <div id="chat-box"></div> </div> </body> </html>
さっそくnodeを起動してみる
chat.jsとindex.htmlを作成したら、さっそくnode.jsをきどうしてみます。node chat.jsそしてブラウザから「http://localhost:8080/」にアクセスすると、 実装した内容が表示されます。
参考資料
以下ページを参考にしました。ありがとうございます(^ー^)ノSocket.IO API 解説
socket.io/#how-to-use
最後に
node.jsといえばSocket.IOを使ってみたいという一心で始めたので、 簡単なアプリですが実装出来て良かった。Socket.IOはドキュメントもまだあまり整備されていないようなので、 バリバリソースコードを読んでいき、良き情報はアウトプットしたいと思います!!
最後までお読み頂きましてありがとうございました!!