質問: { strNickname: socket.id, strMessage: strMessage, strDate: strNow } // 送信元含む全員に送信 //io.emit( 'spread message', strMessage ); io.emit( 'spread message', objMessage ); } ); /* 一度しか行わせたくない */ socket.on( 'once', () => { if(onceFlag) { console.log('once'); } } ); } ); // 公開フォルダの指定 app.use( express.static( __dirname + '/public' ) ); // サーバーの起動 server.listen( PORT, () => { console.log( 'Server on port %d', PORT ); } ); ``` クライアント側ではjqueryを用いてソースコードを用意して、onceのidを付けたdivタグを用意しておりました。 ``` $("#once").on( 'click', () => { socket.emit('once'); } ); ``` 上のイベントが発火したときに「once」のログが1度だけ残り、以後はクリックしてもログが残らないことは確認しております。 しかし、ほぼ同時に起こった場合はあくまで推測でしかなく、試せてない状況です。申し訳ございません。 すみません、よろしくお願いいたします。
回答: > > 1. イベントがほぼ同時に2回以上起こった場合、処理が2度以上行われることがあるかどうか。 > > 2. 上記のことが起こる場合、回避策があるかどうか > > > 1. クライアント側のチャタリングや通信状況によるユーザ操作の繰り返しは**起こりうる**と考えた方が良いと思います。 2. サーバー側で **socket.id と ユーザ情報を対にしたキー**にして連想配列的なオブジェクトやMapを使いステート管理することで回避できそうに思います。 socket.io のリアルタイム通信は、@IT :チャットアプリ開発に見る、Socket.IOの基本ライブラリの使い方 が参考になります。 特に記事の3ページ目まで読み進めると、`io.on("connect", socket=>{ })` のイベントリスナに渡される socket オブジェクトから `socket.id` を接続ごとのユニークな値として活用している事例を確認できたり、リアルタイム通信に存在する3つのステップの後処理まで説明されています。 1. 接続確立 2. 接続中の通信 3. 接続解除 (後処理) ... @IT記事3ページ目の「クライアント切断時の処理」セクションを参照