この切断イベントを処理することはできません。ソケットがクライアントに送信されない/クライアントが応答しない理由がわかりません!
サーバ
io.sockets.on('connection', function (socket) {
socket.on('NewPlayer', function(data1) {
online = online + 1;
console.log('Online players : ' + online);
console.log('New player connected : ' + data1);
Players[data1] = data1;
console.log(Players);
});
socket.on('DelPlayer', function(data) {
delete Players[data];
console.log(Players);
console.log('Adios' + data);
});
socket.on('disconnect', function () {
socket.emit('disconnected');
online = online - 1;
});
});
クライアント
var socket = io.connect('http://localhost');
socket.on('connect', function () {
person_name = Prompt("Welcome. Please enter your name");
socket.emit('NewPlayer', person_name);
socket.on('disconnected', function() {
socket.emit('DelPlayer', person_name);
});
});
クライアントが切断したときにわかるように、Arrayオブジェクト[person_name]は削除する必要がありますが、
OK、名前トラックでプレイヤーを識別する代わりに、接続したソケットを使用します。あなたは次のような実装を持つことができます
var allClients = [];
io.sockets.on('connection', function(socket) {
allClients.Push(socket);
socket.on('disconnect', function() {
console.log('Got disconnect!');
var i = allClients.indexOf(socket);
allClients.splice(i, 1);
});
});
これがあなたが別の方法で考えるのに役立つことを願っています
@ sha1のような人は、OPのコードがなぜ機能しないのか疑問に思う-
サーバーサイドでプレーヤーを削除するためのOPのロジックはDelPlayer
イベントのハンドラーにあり、このイベント(DelPlayer
)を発行するコードはクライアントのdisconnected
イベントコールバック内にあります。
このdisconnected
イベントを発行するサーバー側コードは、ソケットが接続を失ったときに起動されるdisconnect
イベントコールバック内にあります。ソケットはすでに接続を失っていたため、disconnected
イベントはクライアントに到達しません。
承認されたソリューションは、サーバー側でdisconnect
イベントのロジックを実行します。これは、ソケットが切断されると起動するため、動作します。
マップまたはセットを作成し、接続された各ソケットに設定された「on connection」イベントを使用して、逆に「once disconnect」イベントで、先ほど作成したマップからそのソケットを削除します
import * as Server from 'socket.io';
const io = Server();
io.listen(3000);
const connections = new Set();
io.on('connection', function (s) {
connections.add(s);
s.once('disconnect', function () {
connections.delete(s);
});
});