質問するログイン新規登録

質問編集履歴

1

ソースコード、説明の追記

2020/06/21 10:20

投稿

kohaku
kohaku

スコア11

title CHANGED
File without changes
body CHANGED
@@ -40,4 +40,176 @@
40
40
  }
41
41
  } );
42
42
  );
43
- ```
43
+ ```
44
+
45
+ 試したソースコードを追記いたします。
46
+ 最初に記述したソースコードがエラーになってしまい、申し訳ございませんでした。
47
+
48
+ ```node
49
+ 'use strict';
50
+
51
+ // モジュール
52
+ const express = require( 'express' );
53
+ const http = require( 'http' );
54
+ const socketIO = require( 'socket.io' );
55
+
56
+ // オブジェクト
57
+ const app = express();
58
+ const server = http.Server( app );
59
+ const io = socketIO( server );
60
+
61
+ // 定数
62
+ const PORT = process.env.PORT || 8080;
63
+ const SYSTEMNICKNAME = '**system**';
64
+
65
+ // 関数
66
+ // 数字を2桁の文字列に変換
67
+ const toDoubleDigitString =
68
+ ( num ) =>
69
+ {
70
+ return ( "0" + num ).slice( -2 ); // slice( -2 )で後ろから2文字取り出す。
71
+ };
72
+
73
+ // 時刻文字列の作成(書式は「YY/DD/MM hh:mm ss」)
74
+ const makeTimeString =
75
+ ( time ) =>
76
+ {
77
+ return toDoubleDigitString( time.getFullYear() ) + '/' + toDoubleDigitString( time.getMonth() + 1 ) + '/' + toDoubleDigitString( time.getDate() )
78
+ + ' ' + toDoubleDigitString( time.getHours() ) + ':' + toDoubleDigitString( time.getMinutes() ) + ' ' + toDoubleDigitString( time.getSeconds() );
79
+ }
80
+
81
+ // グローバル変数
82
+ let iCountUser = 0; // ユーザー数
83
+
84
+ /* 処理を管理するためのフラグ */
85
+ let onceFlag = true; // ボタンの状態
86
+
87
+ // 接続時の処理
88
+ // ・サーバーとクライアントの接続が確立すると、
89
+ //  サーバー側で、'connection'イベント
90
+ //  クライアント側で、'connect'イベントが発生する
91
+ io.on(
92
+ 'connection',
93
+ ( socket ) =>
94
+ {
95
+ console.log( 'connection' );
96
+
97
+ let strNickname = ''; // コネクションごとで固有のニックネーム。イベントをまたいで使用される。
98
+
99
+ // 切断時の処理
100
+ // ・クライアントが切断したら、サーバー側では'disconnect'イベントが発生する
101
+ socket.on(
102
+ 'disconnect',
103
+ () =>
104
+ {
105
+ console.log( 'disconnect' );
106
+
107
+ if( strNickname )
108
+ {
109
+ // ユーザー数の更新
110
+ iCountUser--;
111
+
112
+ // メッセージオブジェクトに現在時刻を追加
113
+ const strNow = makeTimeString( new Date() );
114
+
115
+ // システムメッセージの作成
116
+ const objMessage = {
117
+ strNickname: SYSTEMNICKNAME,
118
+ strMessage: strNickname + ' left.' + " there are " + iCountUser + " participants",
119
+ strDate: strNow
120
+ }
121
+
122
+ // 送信元含む全員に送信
123
+ io.emit( 'spread message', objMessage );
124
+ }
125
+ } );
126
+
127
+ // 入室時の処理
128
+ // ・クライアント側のメッセージ送信時の「socket.emit( 'join', strNickname );」に対する処理
129
+ socket.on(
130
+ 'join',
131
+ ( strNickname_ ) =>
132
+ {
133
+ console.log( 'joined :', strNickname_ );
134
+
135
+ // コネクションごとで固有のニックネームに設定
136
+ strNickname = strNickname_;
137
+
138
+ // ユーザー数の更新
139
+ iCountUser++;
140
+
141
+ // メッセージオブジェクトに現在時刻を追加
142
+ const strNow = makeTimeString( new Date() );
143
+
144
+ // システムメッセージの作成
145
+ const objMessage = {
146
+ strNickname: SYSTEMNICKNAME,
147
+ strMessage: strNickname + ' joined.' + " there are " + iCountUser + " participants",
148
+ strDate: strNow
149
+ }
150
+
151
+ // 送信元含む全員に送信
152
+ io.emit( 'spread message', objMessage );
153
+ } );
154
+
155
+ // 新しいメッセージ受信時の処理
156
+ // ・クライアント側のメッセージ送信時の「socket.emit( 'new message', $( '#input_message' ).val() );」に対する処理
157
+ socket.on(
158
+ 'new message',
159
+ ( strMessage ) =>
160
+ {
161
+ console.log( 'new message', strMessage );
162
+
163
+ // 現在時刻の文字列の作成
164
+ const strNow = makeTimeString( new Date() );
165
+
166
+ // メッセージオブジェクトの作成
167
+ const objMessage = {
168
+ strNickname: socket.id,
169
+ strMessage: strMessage,
170
+ strDate: strNow
171
+ }
172
+
173
+ // 送信元含む全員に送信
174
+ //io.emit( 'spread message', strMessage );
175
+ io.emit( 'spread message', objMessage );
176
+ } );
177
+
178
+ /* 一度しか行わせたくない */
179
+ socket.on(
180
+ 'once',
181
+ () =>
182
+ {
183
+ if(onceFlag) {
184
+ console.log('once');
185
+ }
186
+ } );
187
+ } );
188
+
189
+ // 公開フォルダの指定
190
+ app.use( express.static( __dirname + '/public' ) );
191
+
192
+ // サーバーの起動
193
+ server.listen(
194
+ PORT,
195
+ () =>
196
+ {
197
+ console.log( 'Server on port %d', PORT );
198
+ } );
199
+ ```
200
+
201
+ クライアント側ではjqueryを用いてソースコードを用意して、onceのidを付けたdivタグを用意しておりました。
202
+ ```javascript
203
+ $("#once").on(
204
+ 'click',
205
+ () =>
206
+ {
207
+ socket.emit('once');
208
+ }
209
+ );
210
+ ```
211
+
212
+ 上のイベントが発火したときに「once」のログが1度だけ残り、以後はクリックしてもログが残らないことは確認しております。
213
+ しかし、ほぼ同時に起こった場合はあくまで推測でしかなく、試せてない状況です。申し訳ございません。
214
+
215
+ すみません、よろしくお願いいたします。