最もシンプルで最もエレガントなソリューション
簡単です:
client.emit("your message");
以上です。
しかし、どうやって?例を挙げて
私たち全員に必要なのは、実際には完全な例であり、それが次のとおりです。これは、最新のsocket.ioバージョン(2.0.3)でテストされており、最新のJavascript(これまでにすべて使用しているはずです)も使用しています。
この例は、サーバーとクライアントの2つの部分で構成されています。クライアントが接続するたびに、サーバーから定期的なシーケンス番号の受信を開始します。新しいクライアントごとに新しいシーケンスが開始されるため、サーバーはそれらを個別に追跡する必要があります。ここで、「特定のクライアントにメッセージを送信する必要があります」が機能します。コードは非常に簡単に理解できます。見てみようよ。
サーバ
server.js
const
io = require("socket.io"),
server = io.listen(8000);
let
sequenceNumberByClient = new Map();
// event fired every time a new client connects:
server.on("connection", (socket) => {
console.info(`Client connected [id=${socket.id}]`);
// initialize this client's sequence number
sequenceNumberByClient.set(socket, 1);
// when socket disconnects, remove it from the list:
socket.on("disconnect", () => {
sequenceNumberByClient.delete(socket);
console.info(`Client gone [id=${socket.id}]`);
});
});
// sends each client its current sequence number
setInterval(() => {
for (const [client, sequenceNumber] of sequenceNumberByClient.entries()) {
client.emit("seq-num", sequenceNumber);
sequenceNumberByClient.set(client, sequenceNumber + 1);
}
}, 1000);
サーバーは、ポート8000で着信接続の待機を開始します。到着すると、その新しいクライアントをマップに追加して、シーケンス番号を追跡できるようにします。またdisconnect
、マップから削除するときに、そのクライアントのイベントをリッスンします。
毎秒、タイマーが起動されます。その場合、サーバーはマップをウォークスルーし、現在のシーケンス番号とともにメッセージをすべてのクライアントに送信します。次に、それをインクリメントして、その数をマップに戻します。これですべてです。かんたん。
クライアント
クライアント部分はさらに単純です。サーバーに接続してseq-num
メッセージをリッスンし、到着するたびにメッセージをコンソールに出力します。
client.js
const
io = require("socket.io-client"),
ioClient = io.connect("http://localhost:8000");
ioClient.on("seq-num", (msg) => console.info(msg));
例を実行する
必要なライブラリをインストールします。
npm install socket.io
npm install socket.io-client
サーバーを実行します。
node server
他のターミナルウィンドウを開き、次のコマンドを実行して、必要な数のクライアントを生成します。
node client
ここに完全なコードの要旨も用意しました。