Socket.io
Socket.IOは、リアルタイムWebアプリケーション用のJavaScriptライブラリです。これにより、Webクライアントとサーバー間のリアルタイムの双方向通信が可能になります。
これは、ブラウザで実行されるクライアント側ライブラリとNode.js用のサーバー側ライブラリの2つの部分に分かれています。
実装
同一サーバーかそうでないかで実装が別れる
同一サーバーの場合、サーバーではSocket.ioを、クライアントではサーバー起動時に生成される/socket.io/socket.io.jsを読み込む
同一サーバーでない場合、サーバーではSocket.ioを、クライアントではSocket.io-clientを使う
サーバー側の実装はほぼ一緒
code:js
import https from 'http'
import express from 'express'
import * as socket from 'socket.io'
const app = express()
const server = https.createServer(app)
const io = new socket.Server(server, {
cors: {
origin: '*', // 適宜合ったものを記述
}
})
const PORT = process.env.PORT || 7000
io.on('connection', (socket) => {
console.log(接続された)
socket.on('message', function (msg, ack: Function) {
console.log(message: ${msg})
ack('')
io.emit('message', msg)
})
})
server.listen(PORT, function () {
console.log(server listening. http://localhost:${PORT})
})
いろいろなチュートリアルを見ながらやってみたがなんでhttpが必要かわからない・・・
サーバーとクライアントが同一サーバーなら、
code:js
app.get('/' , function(req, res){
res.sendFile(__dirname + '/index.html');
})
htmlを表示してあげて、あとはhtml内で<script src="/socket.io/socket.io.js"></script>を読み込み、jsでconst socketio = io()をし、socketio.on()すれば接続できる
クライアント側をサーバー側と別のサーバーにあげたい時は、
socket.io-clientをinstallし、import { io } from 'socket.io-client'でimportしたら、あとはconst socketio = io('サーバーのurl')をし、socketio.on()すれば接続できるのは一緒
じゃあ具体的な送受信はどうするの?ときたら基本的に、
socketio.emit('event名','送信内容', callback())でイベントを送信し、
socketio.on('event名', function('受信データ','callback用の関数') => {})で受け取るって感じ
callback用の関数を指定してあげることによって、クライアント側はいい感じにPromiseで囲ってあげたりできる
無いとクライアント側のcallbackが動かないので空でもいいから送っておくべき
送信範囲を選択
Server側は送信範囲を選択できる、connectionした中で
code:js
io.sockets.emit("message", "全員に送信") //送信元含む全員に送信
io.emit("message", "省略可") //上と同じ
socket.broadcast.emit("message", "送信元以外に送信") //送信元以外の全員に送信
io.to(socket.id).emit('message', '送信元のあなただけ') //特定のユーザーのみ(socket.idで送信元のみに送信)
接続・切断
io.connect('url')で接続、io.disconnect()で切断が任意のタイミングでできる
次はroom分けについて
Object.keys(io.nsps["/"].adapter.rooms["room"]).lengthで接続数が取れたりする