質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1183閲覧

Node.js及びsocket.ioにおいて、切断されたクライアントのsocket.idを廃棄する方法について

kishi_kun

総合スコア26

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2017/10/24 22:28

編集2017/11/09 10:56

###発生していること
Node.jsとsocket.ioを用いてリアルタイムwebアプリを構築しています。
その中でlast few Gcsが発生しました。

原因として下記2つが考えられ、それぞれ対策をしました。
1.ログの書きすぎ
(テキストファイルに書き込みをしていますが1日2,3GB程度になります)
⇛ログの書き込みを削減
2.クライアント側が切断されてもsocket.idを所持したままである

2.に関しての補足
io.json.to(socket.id).emit(~~~)としてイベントを発行していますが
idを所持していると思われるため、今まで接続していたクライアント全てに飛ばしているような
挙動を示します。
例)3回ブラウザを更新すると、4回分上記のイベントが発行されているような挙動

###質問事項
下記2点について教えてください。
1.last few Gcsの対策としては上記2つで対策となっているか。

2.クライアントが切断された場合、socket.idを廃棄したいです。
以下のようなソースを試していますが、廃棄されませんでした。
何か方法はございますか。

server.js

/// socket.on("disconnect",(reason)⇛{ console.log(///); delete socket.id; } ///

###追記
下記のようにソースを書きなおしましたが
3回ブラウザを更新すると、4回分上記のイベントが発行されているような挙動は変わらず
コンソールへの出力もコメント1とコメント2で同様のIDが出力されています。

/// let clients = {}; /// sockets.on('connection', function(socket) { clients[socket.id] = socket; /// watcher.on('add'function(**){ try{ while(socket.connected){ io.json.to(socket.id).emit(~~~); } catch(e){ } )}; /// socket.on('disconnect', function() { conlose.log([socket.id]);  //コメント1 delete clients[socket.id]; console.log([socket.id]); //コメント2 }); }); ///

###追記2
下記のようにソースを書きなおしました
しかしLast few GCsが起こるようになってしまいました。
以下の書き方は正しかったのでしょうか。

var chokidar = require('chokidar') var watcher = chokidar.watch /// sockets.on('connection', function(socket) { clients[socket.id] = socket; /// watcher.on('add'function(**){ try{ while(socket.connected){ io.json.to(socket.id).emit(~~~); } catch(e){ } )}; //

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんな感じじゃダメですか?

javascript

1let clients = {}; 2 3sockets.on('connection', function(socket) { 4 clients[socket.id] = socket; 5 6 socket.on('disconnect', function() { 7 delete clients[socket.id]; 8 }); 9});

投稿2017/10/26 01:25

編集2017/10/26 01:31
momf

総合スコア416

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kishi_kun

2017/10/26 22:03

回答ありがとうございます。 ですが、追記した様にやってみても上手くいきませんでした。
momf

2017/10/26 22:05

クライアントが切断しても接続が残っているような感じで、ってことでしょうか
kishi_kun

2017/10/26 22:11

そうですね、頂いた回答をもとに内容を修正致しましたがおっしゃられるような感じの挙動を示しています。
momf

2017/10/30 04:20 編集

サーバー側のコードで、クライアントに送る処理を while(socket.connected){} の中に記述するとsocketに繋がっている間にしかやらない処理を記述できるはずです。試してみてください。
kishi_kun

2017/10/29 16:20

頂いた回答を元に修正した所、Last few GCsが起こるようになりました。 書き方としては上記の書き方でよろしかったのでしょうか。
momf

2017/10/30 04:20

watcher.onとは何でしょうか 全体のコードを見てみたいです
kishi_kun

2017/11/09 10:58

返信が遅れてしまいすみません。 >watcher.onとは何でしょうか ⇛追記しました。chokidarです。  ディレクトリにファイルが追加された時にイベントを発行させるために利用しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問