【Node.js】Socket.IO サンプルコード(1)~簡易チャットアプリ~

  • このエントリーをはてなブックマークに追加

Socket.IO サンプルコード(1)~簡易チャットアプリ~
Socket.IOを使用する場合には、HTTPサーバーを立ててSocket.IOを統合する必要がある。
このときhttpでもhttpsのどっちでも動く。httpとhttpsの2種類のコードを次に示す。
(1)サーバー側で、httpサーバーとSocket.IOの初期化を行うコード
(2)サーバー側で、httpsサーバーとSocket.IOの初期化を行うコード



(1)サーバー側で、httpサーバーとSocket.IOの初期化を行うコード
client.html


<!DOCTYPE html>
<html lang="ja">
<head>
  <title>Socket.IO サンプルコード(1)~簡易チャットアプリ~</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.7.1/socket.io.js"></script>
</head>
<body>
  <h1>Socket.IO サンプルコード(1)~簡易チャットアプリ~</h1>

  <input type="text" id="messageInput">
  <button onclick="sendMessage()">送信</button>

  <ul id="messageList"></ul>

  <script>
    //この処理でサーバーと通信をしているな。
    const socket = io('http://192.168.2.100:3000');
    
    // サーバーからのメッセージを受信
    socket.on('message', (data) => {
      // HTML内のID=messageList」を持つ要素を取得する。
      const messageList = document.getElementById('messageList');
      // 新しいli要素を作成する。li要素はメッセージをリストアイテムとして表示するために使用される。
      const li = document.createElement('li');
      // li要素のテキストコンテンツを受信したメッセージ(data)に設定する。
      li.textContent = data;
      // li要素をmessageList要素に追加する。これにより、受信したメッセージがリスト内に表示される。
      messageList.appendChild(li);
    });

    // メッセージを送信
    function sendMessage() {
      // HTML内のID=messageInput」を持つ要素を取得する。
      const messageInput = document.getElementById('messageInput');
      // テキスト入力欄の値を変数messageに代入する。
      const message = messageInput.value;
      // テキスト入力欄の値を空文字にする。
      messageInput.value = '';

      // サーバーに対して message という名前のイベントを送信する。
      // ここで message は任意の名前で、サーバー側で受け取る際にイベント名として使用される。
      socket.emit('message', message);
    }

  </script>
</body>
</html>

server_http.js



const hostname = '192.168.2.100';
const port = 3000;

// httpモジュールをrequireを使ってインポートして変数httpに格納する。
const http = require('http');

// httpオブジェクトからcreateServerメソッドを実行する。
// http.createServer()の戻り値は、http.Serverのインスタンスである。
// つまり変数serverには、http.Serverのインスタンスが格納される。
const server = http.createServer();

// Socket.IOの初期化
// http://192.168.2.100:3000/socket.io/socket.io.jsにアクセス可能になる。
const io = require('socket.io')(server,{
  // CORS(Cross-Origin Resouce Sharing)の設定
  cors: {
    // コメントアウトしても正常に動く。
    // コメントアウトしたら、origin: '*'と同じ設定になる。
    origin: ['http://localhost', 'http://127.0.0.1','https://localhost', 'https://127.0.0.1','http://192.168.2.100','https://192.168.2.100'],
    //全てのURLを指定するときは*を使う。
    //origin: '*',
  },
});

// サーバーは指定したポートとホストで接続を待ち受け、クライアントからのリクエストを聞いて受け付ける状態になる。
// ここでの「listen」は文字通り「接続の待ち受け」や「受信を聴く」という意味で使われている。
server.listen(port, hostname,() => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

// クライアント側で socket.emit('message', message); 
// を実行すると、サーバーの io.on('message', ...) で定義された
// コールバック関数が呼び出され、クライアントからのメッセージが受信される。
io.on('connection', (socket) => {
  console.log('クライアントが接続しました');

  // クライアントからのメッセージを受信
  // クライアント側で socket.emit('message', message); を実行すると、
  // サーバー側で定義された socket.on('message', ...) のコールバック関数
  // が実行されるという流れになります。
  socket.on('message', (data) => {
    console.log('クライアントからのメッセージ:', data);
    // 受信したメッセージを全クライアントに送信
    // クライアント側でsocket.emit('message', message);を実行した人も含めて送る。
    io.emit('message', data);
  });

  // クライアントとの接続が切断されたときの処理
  socket.on('disconnect', () => {
    console.log('クライアントが切断しました');
  });
});

(2)サーバー側で、httpsサーバーとSocket.IOの初期化を行うコード
client.html


<!DOCTYPE html>
<html lang="ja">
<head>
  <title>Socket.IO サンプルコード(1)~簡易チャットアプリ~</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.7.1/socket.io.js"></script>
</head>
<body>
  <h1>Socket.IO サンプルコード(1)~簡易チャットアプリ~</h1>

  <input type="text" id="messageInput">
  <button onclick="sendMessage()">送信</button>

  <ul id="messageList"></ul>

  <script>
    //この処理でサーバーと通信をしているな。
    const socket = io('https://192.168.2.100:3000');
    
    // サーバーからのメッセージを受信
    socket.on('message', (data) => {
      // HTML内のID=messageList」を持つ要素を取得する。
      const messageList = document.getElementById('messageList');
      // 新しいli要素を作成する。li要素はメッセージをリストアイテムとして表示するために使用される。
      const li = document.createElement('li');
      // li要素のテキストコンテンツを受信したメッセージ(data)に設定する。
      li.textContent = data;
      // li要素をmessageList要素に追加する。これにより、受信したメッセージがリスト内に表示される。
      messageList.appendChild(li);
    });

    // メッセージを送信
    function sendMessage() {
      // HTML内のID=messageInput」を持つ要素を取得する。
      const messageInput = document.getElementById('messageInput');
      // テキスト入力欄の値を変数messageに代入する。
      const message = messageInput.value;
      // テキスト入力欄の値を空文字にする。
      messageInput.value = '';

      // サーバーに対して message という名前のイベントを送信する。
      // ここで message は任意の名前で、サーバー側で受け取る際にイベント名として使用される。
      socket.emit('message', message);
    }

  </script>
</body>
</html>

server_https.js
秘密鍵と自己署名証明書(オレオレ証明書)の説明は省略する。


const hostname = '192.168.2.100';
const port = 3000;

// 秘密鍵を指定する。
const sslServerKey = '0322/server-key.pem';
// 自己署名証明書(オレオレ証明書)を指定する。
const sslServerCrt = '0322/server-crt.pem';

// fsモジュールをrequireを使ってインポートして変数fsに格納する。
const fs = require('fs');

// 変数optionsにオブジェクトを格納する。
const options = {
  // 指定されたファイルパスからファイル(秘密鍵)を同期的に読み込む。
  key: fs.readFileSync(sslServerKey),
  // 指定されたファイルパスからファイル(自己署名証明書(オレオレ証明書))を同期的に読み込む。
  cert: fs.readFileSync(sslServerCrt)
};

// httpsモジュールをrequireを使ってインポートして、変数httpに格納する。
const https = require('https');

// httpsオブジェクトからcreateServerメソッドを実行する。
// https.createServer()の戻り値は、https.Serverのインスタンスである。
// つまり変数serverには、https.Serverのインスタンスが格納される。
const server = https.createServer(options);

// Socket.IOの初期化
// http://192.168.2.100:3000/socket.io/socket.io.jsにアクセス可能になる。
const io = require('socket.io')(server,{
  // CORS(Cross-Origin Resouce Sharing)の設定
  cors: {
    // コメントアウトしても正常に動く。
    // コメントアウトしたら、origin: '*'と同じ設定になる。
    origin: ['http://localhost', 'http://127.0.0.1','https://localhost', 'https://127.0.0.1','http://192.168.2.100','https://192.168.2.100'],
    //全てのURLを指定するときは*を使う。
    //origin: '*',
  },
});

// サーバーは指定したポートとホストで接続を待ち受け、クライアントからのリクエストを聞いて受け付ける状態になる。
// ここでの「listen」は文字通り「接続の待ち受け」や「受信を聴く」という意味で使われている。
server.listen(port, hostname,() => {
  console.log(`Server running at https://${hostname}:${port}/`);
});

// クライアント側で socket.emit('message', message); 
// を実行すると、サーバーの io.on('message', ...) で定義された
// コールバック関数が呼び出され、クライアントからのメッセージが受信される。
io.on('connection', (socket) => {
  console.log('クライアントが接続しました');

  // クライアントからのメッセージを受信
  // クライアント側で socket.emit('message', message); を実行すると、
  // サーバー側で定義された socket.on('message', ...) のコールバック関数
  // が実行されるという流れになります。
  socket.on('message', (data) => {
    console.log('クライアントからのメッセージ:', data);
    // 受信したメッセージを全クライアントに送信
    // クライアント側でsocket.emit('message', message);を実行した人も含めて送る。
    io.emit('message', data);
  });

  // クライアントとの接続が切断されたときの処理
  socket.on('disconnect', () => {
    console.log('クライアントが切断しました');
  });
});
  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*