Closed11

久しぶりの Socket.IO

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

コーディング

index.js
const express = require('express');
const { createServer } = require('node:http');

const app = express();
const server = createServer(app);

app.get('/', (req, res) => {
    res.send('<h1>Hello world</h1>');
});

server.listen(3000, () => {
    console.log('server running at http://localhost:3000');
});
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

HTML ファイル

コマンド
touch index.html
index.html
<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
    <title>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;
      }
    </style>
  </head>
  <body>
    <ul id="messages"></ul>
    <form action="" id="form">
      <input type="text" id="input" autocomplete="off" />
      <button>Send</button>
    </form>
  </body>
</html>
index.js
const express = require('express');
const { createServer } = require('node:http');
const { join } = require('node:path');

const app = express();
const server = createServer(app);

app.get('/', (req, res) => {
    res.sendFile(join(__dirname, 'index.html'));
});

server.listen(3000, () => {
    console.log('server running at http://localhost:3000');
});

サーバー再起動後にブラウザで http://localhost:3000 にアクセスする。


こんな感じのチャット画面が表示される。

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

Socket.IO 統合

コマンド
const express = require('express');
const { createServer } = require('node:http');
const { join } = require('node:path');
const { Server } = require('socket.io');

const app = express();
const server = createServer(app);
const io = new Server(server);

app.get('/', (req, res) => {
    res.sendFile(join(__dirname, 'index.html'));
});

io.on('connection', (socket) => {
    console.log('a user connected');
})

server.listen(3000, () => {
    console.log('server running at http://localhost:3000');
});
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

動作確認

サーバーを再起動してからページをリロードすると下記のメッセージが出力される。

コンソール出力
a user connected
このスクラップは3ヶ月前にクローズされました