ServBayを使ったSocket.ioプロジェクトの作成と実行
Socket.ioは、リアルタイムかつ双方向でイベント駆動型のWebアプリケーション構築に特化した人気のJavaScriptライブラリです。WebSocketプロトコルに基づき、必要に応じて(ロングポーリングなどの)フォールバック機構を備え、様々なクライアントやネットワーク環境下でも信頼性の高いリアルタイム通信を実現します。
このガイドでは、ServBayの強力なローカル開発環境を活用して、Socket.ioプロジェクトを構築・実行・管理する手順を詳しく解説します。ServBayは予め用意されたNode.js環境と、便利なウェブサイト(旧称:ホスト)管理機能を提供し、Socket.io開発を一層効率化します。
Socket.ioとは?
Socket.ioはリアルタイムかつ双方向・イベント駆動型通信を実現するライブラリです。主に以下の2つから構成されます。
- Node.jsサーバー上で動作するバックエンドライブラリ
- ブラウザで動作するクライアントJavaScriptライブラリ
Socket.ioは主としてWebSocketの利用を目的としていますが、WebSocket非対応の旧式ブラウザや制限のあるネットワーク環境でも、Adobe Flash SocketやAjax Long Polling、Ajax Multipart Streaming、Forever IFrame、JSONP Pollingなど多彩な転送方式を自動判別し、フォールバックします。そのため非常に高い互換性を備えています。
Socket.ioの主な特徴とメリット
- リアルタイム通信: サーバーとクライアント間で即時にデータ交換が可能。チャットアプリ、コラボレーションツール、リアルタイムダッシュボード、オンラインゲームなどに最適です。
- クロスプラットフォーム対応: ウェブブラウザ、モバイルアプリ、Node.jsサーバー環境で利用できます。
- 自動再接続: ネットワーク途絶時にクライアントが自動で再接続を試み、アプリの堅牢性を高めます。
- イベント駆動: イベントベースのプログラミングモデルで、非同期通信の管理が直感的・容易です。
- ルームと名前空間: クライアントを「ルーム」にグルーピングして、特定グループだけにメッセージをブロードキャストできます。「名前空間」では同一接続上での多重化やリソースの使い分けが可能です。
- バイナリ対応: バイナリデータの送受信もスムーズに行えます。
- 高い互換性: 様々なネットワーク環境下でも、多彩な転送方式により高い信頼性を確保します。
Socket.ioを使えば、開発者はアプリケーションのロジックに専念でき、煩雑なリアルタイム通信の実装に煩わされることがありません。
ServBayでのSocket.ioプロジェクト作成と実行
ServBayはNode.js開発者にとって、ランタイム・npmパッケージ管理・ウェブサイト管理ツールが一体化した、すぐに使えるローカル開発環境です。これらの機能を活用してSocket.ioのサンプルプロジェクトをセットアップ・実行します。
前提条件
始める前に、以下の準備を済ませてください。
- ServBayのインストール: ServBay公式サイト から最新バージョンをダウンロードしインストールします。
- Node.jsパッケージのインストール: ServBay内でNode.jsパッケージをインストールします。ServBayコントロールパネルの「パッケージ」(旧:サービス)から追加・管理できます。詳しくはServBayでのNode.js利用方法ドキュメントをご参照ください。
Socket.ioサンプルプロジェクトの作成
ここでは、簡単なチャットアプリを例として作成します。
プロジェクトディレクトリを初期化:
まず端末アプリケーションを開きます。ServBayではウェブサイトプロジェクトを
/Applications/ServBay/www
ディレクトリに設置することを推奨しています。ディレクトリへ移動し、新規プロジェクトフォルダを作成して、Node.jsプロジェクトの初期化&必要な依存パッケージのインストールを行います。bashcd /Applications/ServBay/www mkdir servbay-socketio-chat cd servbay-socketio-chat npm init -y npm install express socket.io
1
2
3
4
5これにより、
servbay-socketio-chat
フォルダにpackage.json
が作成され、express
(静的ファイル配信&HTTPリクエスト処理)とsocket.io
(サーバー&クライアント用ライブラリ)のコア依存パッケージがインストールされます。サーバーファイル(
server.js
)の作成:servbay-socketio-chat
プロジェクトのルートディレクトリにserver.js
という名前のファイルを作成し、下記のコードをコピー・貼り付けます。このファイルはHTTPサーバーの起動、Socket.ioの統合、クライアント接続・メッセージブロードキャスト処理を担当します。javascriptconst express = require('express'); const http = require('http'); const socketIo = require('socket.io'); const path = require('path'); // pathモジュールをインポート const app = express(); // expressアプリを元にHTTPサーバーを作成 const server = http.createServer(app); // Socket.ioをHTTPサーバーにアタッチ const io = socketIo(server); // 静的ファイルディレクトリ設定(カレントディレクトリ指定) app.use(express.static(__dirname)); // ルートパスへのGETリクエストを受け取り、index.htmlを送信 app.get('/', (req, res) => { // path.joinで異なるOS環境でもパスを適切に生成 res.sendFile(path.join(__dirname, 'index.html')); }); // Socket.ioの接続イベントを監視 io.on('connection', (socket) => { console.log('a user connected'); // 新しいユーザーが接続した際にログを出力 // 切断イベントを監視 socket.on('disconnect', () => { console.log('user disconnected'); // ユーザー切断時にログを出力 }); // 'chat message'イベントを監視 socket.on('chat message', (msg) => { console.log('message: ' + msg); // 受信したメッセージを表示 // 受信したメッセージを全接続クライアントへブロードキャスト io.emit('chat message', msg); }); }); // 環境変数 または デフォルト値からポート番号を取得 const port = process.env.PORT || 3000; server.listen(port, () => { console.log(`Server running on port ${port}`); console.log(`Access it via http://localhost:${port} (direct) or via ServBay reverse proxy`); });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43コード解説:
express
でWebサーバーを構築し、index.html
の配信を担当します。http.createServer(app)
により、Socket.io連携用の標準HTTPサーバーを作成します。socketIo(server)
でSocket.ioを初期化し、HTTPサーバーにバインドします。io.on('connection', ...)
でクライアントの新規接続を監視します。socket.on('disconnect', ...)
でクライアント切断時の処理を記述します。socket.on('chat message', ...)
でクライアント発信の'chat message'イベント受信処理を記述します。io.emit('chat message', msg)
で受信した全文を全クライアントへ送信します。
クライアントファイル(
index.html
)の作成:servbay-socketio-chat
プロジェクトのルートディレクトリにindex.html
ファイルを作成し、下記の内容をコピー・貼り付けます。HTML構造・スタイル、Socket.ioクライアントのJavaScriptロジック(サーバーへの接続、メッセージ送信・表示)を含みます。html<!DOCTYPE html> <html> <head> <title>ServBay Socket.io Chat</title> <style> body { margin: 0; padding-bottom: 3rem; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } #form { background: rgba(0, 0, 0, 0.15); padding: 0.25rem; position: fixed; bottom: 0; left: 0; right: 0; display: flex; height: 3rem; box-sizing: border-box; backdrop-filter: blur(10px); } #input { border: none; padding: 0 1rem; flex-grow: 1; border-radius: 2rem; margin: 0.25rem; } #input:focus { outline: none; } #form > button { background: #333; border: none; padding: 0 1rem; margin: 0.25rem; border-radius: 3px; outline: none; color: #fff; } #messages { list-style-type: none; margin: 0; padding: 0; } #messages > li { padding: 0.5rem 1rem; } #messages > li:nth-child(odd) { background: #efefef; } .servbay-banner { background-color: #007bff; /* ServBayブルー */ color: white; text-align: center; padding: 15px 0; font-size: 22px; margin-bottom: 20px; font-weight: bold; } </style> </head> <body> <div class="servbay-banner">ServBay Socket.io Chatデモへようこそ!</div> <ul id="messages"></ul> <form id="form" action=""> <input id="input" autocomplete="off" /><button type="submit">送信</button> </form> <!-- Socket.ioクライアントライブラリを読み込み --> <!-- このファイルはSocket.ioサーバーが起動時に動的生成します --> <script src="/socket.io/socket.io.js"></script> <script> // Socket.ioサーバーへ接続 // クライアントとサーバーが同じドメイン・ポートの場合、自動接続されます var socket = io(); var form = document.getElementById('form'); var input = document.getElementById('input'); var messages = document.getElementById('messages'); // messages要素の取得 form.addEventListener('submit', function(e) { e.preventDefault(); // フォーム送信のデフォルト挙動を阻止 if (input.value) { // 'chat message'イベントと送信内容をサーバーに送る socket.emit('chat message', input.value); input.value = ''; // 入力欄をクリア } }); // サーバーからの'chat message'イベントを受信 socket.on('chat message', function(msg) { // 新しいリストアイテムを作成しメッセージを表示 var item = document.createElement('li'); item.textContent = msg; // textContentでXSS攻撃を防止 messages.appendChild(item); // リストに追加 // 最新メッセージへ自動スクロール window.scrollTo(0, document.body.scrollHeight); }); </script> </body> </html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64コード解説:
- シンプルなHTML構造・CSS(ServBayブランドカラーのバナー含む)、メッセージ一覧(
ul#messages
)と送信フォーム(form#form
)を備えています。 <script src="/socket.io/socket.io.js"></script>
でSocket.ioクライアントをロードします。これはサーバーが自動的に用意します。io()
でSocket.ioサーバーへの接続を初期化し、接続します。- フォーム送信イベントを監視し、デフォルト挙動を阻止したうえで、
socket.emit('chat message', input.value)
でサーバーへイベント送信。 - サーバーから送られた'message'イベントを受信し、メッセージリストに追加します。
- シンプルなHTML構造・CSS(ServBayブランドカラーのバナー含む)、メッセージ一覧(
これで、Socket.ioサンプルプロジェクトの基本コードは完成です。次にServBayでの実行・アクセス方法を見ていきます。
ServBayでのプロジェクト実行(開発モード)
開発段階では、Node.jsサーバーを直接起動した後、ServBayのリバースプロキシ機能でローカルのドメインへマッピングするのが一般的です。
Node.js開発サーバーの起動:
ターミナルを開きプロジェクトディレクトリ
/Applications/ServBay/www/servbay-socketio-chat
へ移動し、下記コマンドでサーバーを起動します。ここではポートを8585に指定しています(必要に応じて変更可能)。bashcd /Applications/ServBay/www/servbay-socketio-chat PORT=8585 node server.js
1
2サーバーが起動すると、
Server running on port 8585
等の出力がターミナルに表示されます。サーバーはローカルの8585ポートで待機状態となっています。ServBayでウェブサイト(リバースプロキシ)を設定:
より便利にローカルドメインを利用し、ServBayのHTTPS/SSL機能も活用するため、リバースプロキシ型のウェブサイトを新規作成します。
- ServBayコントロールパネルを開く
- 「ウェブサイト」(旧:ホスト)へ移動
- 新規ウェブサイト追加ボタンをクリック
- 以下のように設定
- 名前:
ServBay Socket.io Dev
(他でもOK) - ドメイン:
servbay-socketio-dev.servbay.demo
(または任意の.servbay.demo
ドメイン) - タイプ:
リバースプロキシ(Reverse Proxy)
- プロキシ先:
http://127.0.0.1:8585
(先ほど起動したNode.jsサーバーのアドレスとポート)
- 名前:
- 設定を保存。ServBayは自動的に設定を適用し、関連するWebサーバー(CaddyまたはNginx、設定状況により異なる)を必要に応じて再起動します。
注意: リバースプロキシでは、通常のHTTP転送だけでなくWebSocketプロトコルのアップグレード処理も正しく対応する必要があります。ServBay内蔵のCaddyまたはNginxはWebSocketプロキシをデフォルトでサポートしています。
ServBayへのウェブサイト追加手順はNode.js開発ウェブサイトの追加を、ローカルドメインのHTTPS有効化はSSL/TLSでウェブサイトを保護 ドキュメントを参照ください。ServBay User CAおよびServBay Public CAでローカルSSL証明書発行・信頼登録が可能です。
開発モードサイトへアクセス:
ブラウザで設定したドメイン例
https://servbay-socketio-dev.servbay.demo
を開きます。チャット画面が表示され、別のタブや他の端末からもアクセスしてリアルタイムチャットをテストできます。
ServBayでのプロジェクトデプロイ(本番モード)
本番環境では、PM2やforeverなどのプロセスマネージャでNode.jsアプリをより堅牢に運用し、ServBayと連携するのがおすすめです。ここではServBayのリバースプロキシ設定例のみ紹介します(Node.js本体はバックグラウンド等で安定稼働しているものと仮定)。
Node.js本番サーバーの起動:
本番では一般にプロセスマネージャ導入が推奨されます。たとえばPM2の場合:
bash# PM2未インストール時 # npm install pm2 -g cd /Applications/ServBay/www/servbay-socketio-chat PORT=8586 NODE_ENV=production pm2 start server.js --name servbay-socketio-prod
1
2
3
4
5server.js
をPM2で起動し、ポート8586を指定、NODE_ENV
をproductionに設定します。プロセスマネージャは障害時もアプリの自動復旧・バックグラウンド化を行います。ServBayで本番サイト(リバースプロキシ)を設定:
開発モードと同様に、ServBay内で新たなリバースプロキシ型ウェブサイトを作成し、本番サーバーポートへ転送します。
- ServBayコントロールパネルを開く
- 「ウェブサイト」へ移動
- 新規ウェブサイト追加ボタンをクリック
- 以下のように設定
- 名前:
ServBay Socket.io Prod
(他でもOK) - ドメイン:
servbay-socketio-prod.servbay.demo
(または任意の.servbay.demo
ドメイン) - タイプ:
リバースプロキシ(Reverse Proxy)
- プロキシ先:
http://127.0.0.1:8586
(本番サーバーのポートへ転送)
- 名前:
- 設定を保存
本番モードサイトへアクセス:
ブラウザで指定ドメイン
https://servbay-socketio-prod.servbay.demo
を開きます。
ServBayのリバースプロキシ機能を使えば、開発・本番を問わず複数のNode.jsアプリを容易に管理し、それぞれに独立したローカルドメインやSSL証明書を設定できます。システムのhostsファイルや複雑なWebサーバー設定も不要なので便利です。
ServBayが提供するデータベースへの接続
ServBayはMySQL、MariaDB、PostgreSQL、MongoDB、Redisなど多彩なデータベースパッケージをサポートしています。Socket.ioアプリでも、ユーザーデータやメッセージ履歴などを保存するため、これらのデータベースとの連携が必要になるでしょう。接続例を紹介します。
重要: 下記コードを実行する前に、ServBayのコントロールパネルから該当データベースパッケージのインストール・起動を済ませておくこと。またデフォルト接続情報(ポート、ユーザー名・パスワードなど)はServBayのデータベース管理画面やドキュメントに記載されています。たとえばMySQL/MariaDBのrootユーザー用パスワードは初期設定時に決定されます。ServBay機能でrootパスワードの再設定も可能です。
MongoDBへの接続:
Mongoose ODM(または公式
mongodb
ドライバ)をインストールbashnpm install mongoose
1Node.jsコード(
server.js
やDB用モジュール)に下記接続処理を追加javascriptconst mongoose = require('mongoose'); // ローカル実行のMongoDB(デフォルトポート27017)へ接続 // データベース名 servbay_socketio_app(例) mongoose.connect('mongodb://localhost:27017/servbay_socketio_app', { useNewUrlParser: true, useUnifiedTopology: true, // 必要なら user, pass で認証情報を指定 // user: 'your_mongo_user', // pass: 'your_mongo_password' }) .then(() => console.log('MongoDBへの接続に成功しました (Mongoose経由)')) .catch(err => console.error('MongoDB接続エラー:', err)); // mongoose.model() でSchemaやModelを定義できます // ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Redisへの接続:
redis
クライアントライブラリをインストールbashnpm install redis
1Node.jsコードで下記のように接続
javascriptconst redis = require('redis'); // Redisクライアントインスタンス作成。localhost:6379(デフォルトポート)へ接続 const client = redis.createClient({ // パスワード認証が必要な場合 // password: 'your_redis_password', // url: 'redis://localhost:6379' // URL形式でもOK }); client.on('error', (err) => { console.error('Redis接続エラー:', err); }); client.on('connect', () => { console.log('Redisクライアントの接続に成功しました'); }); // Redisサーバーへの接続(v4+は明示的にconnect()要) client.connect(); // clientオブジェクトでコマンド実行可能 // 例: await client.set('mykey', 'myvalue'); // ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23MariaDB / MySQLへの接続:
ServBayはMariaDB・MySQLの双方に対応。同様の方法で接続できます。ここでは
mariadb
ライブラリ(MySQLとも互換)で紹介。mariadb
クライアントライブラリをインストールbashnpm install mariadb
1Node.jsコードに下記接続処理を追加
javascriptconst mariadb = require('mariadb'); // コネクションプールの作成 const pool = mariadb.createPool({ host: 'localhost', port: 3306, // MariaDB/MySQLデフォルトポート user: 'root', // ServBayのデフォルトユーザーは通常'root' password: 'password', // 実際のパスワードに書き換え database: 'servbay_socketio_app', // サンプルDB名 connectionLimit: 5 // プールの上限 }); // プールから接続を取得しテスト pool.getConnection() .then(conn => { console.log("MariaDB/MySQLへの接続に成功しました"); conn.release(); // 接続をプールに戻す // poolオブジェクトで各種クエリ実行可 // 例: await pool.query("SELECT 1"); // ... }) .catch(err => { console.error("MariaDB/MySQL接続エラー:", err); });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24注意:
password
は実際にServBayで設定したrootユーザー用パスワードに差し替えてください。アプリ専用のDBユーザー作成を推奨します(root直指定は非推奨)。PostgreSQLへの接続:
pg
クライアントライブラリをインストールbashnpm install pg
1Node.jsコードで下記接続処理を追加
javascriptconst { Pool } = require('pg'); // コネクションプールを作成 const pool = new Pool({ user: 'user', // PostgreSQLのデフォルトユーザー(user等) host: 'localhost', database: 'servbay_socketio_app', // サンプルDB名 password: 'password', // 実際のパスワードに書き換え port: 5432, // PostgreSQLデフォルトポート }); // プールから接続を取得しテスト pool.connect((err, client, done) => { if (err) { console.error('PostgreSQL接続エラー:', err); return; } console.log('PostgreSQLへの接続に成功しました'); client.release(); // poolオブジェクトでクエリ実行可 // 例: pool.query('SELECT NOW()', (err, res) => { ... }); // ... });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23注意:
user
やpassword
はServBayのPostgreSQL設定に合う、実際のユーザー&パスワードに差し替えてください。
これらを組み合わせれば、Socket.ioアプリにデータ永続化や高度な機能を追加できます。ServBayなら、Node.js&各種DBの統合開発環境をローカルですぐ構築可能です。
注意点まとめ
- ポート重複: Node.jsアプリが使用するポート(例:8585, 8586)が他アプリで利用されていないことを確認してください。衝突時は
PORT
環境変数の値を変更してください。 - ServBayのウェブサイト設定: リバースプロキシ型ウェブサイトの設定後、ServBayのWebサーバー(CaddyまたはNginx)が最新構成で再起動済みか確認を。
- WebSocketプロキシ: ServBayのリバースプロキシ設定はWebSocketプロトコルのアップグレードを標準サポート。接続障害時はWebサーバーログや設定を見直し、WebSocket対応が有効か確認してください。
- ファイアウォール: OSのファイアウォールがServBay関連の主要ポート(80, 443)や、Node.jsアプリ用ポートの通信をブロックしていないことを確認してください。