Closed11
久しぶりの Socket.IO
このスクラップについて
Socket.IO の Getting Started のドキュメントに従ってセットアップする過程を記録していく。
ディレクトリ作成
コマンド
cd ~/workspace
mkdir ltns-socketio
cd ltns-socketio
npm init -y
npm install express
touch index.js
コーディング
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');
});
実行
コマンド
node index.js
動作確認
コマンド
curl http://localhost:3000
コンソール出力
<h1>Hello world</h1>
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 にアクセスする。
こんな感じのチャット画面が表示される。
Socket.IO インストール
コマンド
npm install socket.io
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');
});
クライアント側
下記のコードを </body>
の前に挿入する。
index.html(追記)
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
</script>
動作確認
サーバーを再起動してからページをリロードすると下記のメッセージが出力される。
コンソール出力
a user connected
一旦クローズ
このスクラップを書いている途中に tRPC のサブスクリプションを試してみたくなったので一旦クローズする。
このスクラップは3ヶ月前にクローズされました