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

質問編集履歴

4

タグ変更

2019/05/10 15:00

投稿

Mustard
Mustard

スコア11

title CHANGED
File without changes
body CHANGED
File without changes

3

追記

2019/05/10 15:00

投稿

Mustard
Mustard

スコア11

title CHANGED
File without changes
body CHANGED
@@ -208,4 +208,56 @@
208
208
  }
209
209
  }
210
210
  ```
211
- このように書き換えたところ、socketListには確かに端末B,Cそれぞれのsocketが別のポートの値で格納されていましたが受信できたのは先に接続した端末Bだけでした。ループ処理も二回実行されていたためwrite自体は2回呼ばれているはずなのですが...
211
+ このように書き換えたところ、socketListには確かに端末B,Cそれぞれのsocketが別のポートの値で格納されていましたが受信できたのは先に接続した端末Bだけでした。ループ処理も二回実行されていたためwrite自体は2回呼ばれているはずなのですが...
212
+
213
+ (追記2)
214
+ ```GroupOwnerSocketHandler
215
+ public class GroupOwnerSocketHandler extends Thread {
216
+ public static ArrayList<ChatManager> chatList = new ArrayList<ChatManager>();
217
+ --(略)--
218
+ @Override
219
+ public void run() {
220
+ while (true) {
221
+ try {
222
+ //クライアントごとにsocketをリストで管理
223
+ Socket clientSocket = socket.accept();
224
+ ChatManager clientChat = new ChatManager(clientSocket, handler);
225
+ chatList.add(clientChat);
226
+ pool.execute(clientChat);
227
+ Log.d(TAG, "Launching the I/O handler");
228
+ } catch (IOException e) {
229
+ --(略)--
230
+ }
231
+ }
232
+ }
233
+ }
234
+ ```
235
+ とすることで複数の端末に送信することができました。
236
+ ですが今度は同じ端末に対して一度しか送信がされなくなってしまいました。(端末AからB,Cに対して一度ずつ送信を確認)
237
+ ChatManagerを配列として管理したので更新が正常に行われていないのではないかと考えています。
238
+ ChatManagerからhandler.obtainMessageを受け取った際のアクティビティの処理は以下のようになっていました。
239
+ ```WiFiServiceDiscoveryActivity
240
+ @Override
241
+ public boolean handleMessage(Message msg) {
242
+ switch (msg.what) {
243
+ case MESSAGE_READ:
244
+ byte[] readBuf = (byte[]) msg.obj;
245
+ // construct a string from the valid bytes in the buffer
246
+ String readMessage = new String(readBuf, 0, msg.arg1);
247
+ Log.d(TAG, readMessage);
248
+ (chatFragment).pushMessage("Buddy: " + readMessage);
249
+ break;
250
+
251
+ case MY_HANDLE:
252
+ Object obj = msg.obj;
253
+ (chatFragment).setChatManager((ChatManager) obj);
254
+
255
+ }
256
+ return true;
257
+ }
258
+ ```
259
+ ```setChatManager
260
+ public void setChatManager(ChatManager obj) {
261
+ chatManager = obj;
262
+ }
263
+ ```

2

追記

2019/05/09 14:54

投稿

Mustard
Mustard

スコア11

title CHANGED
File without changes
body CHANGED
@@ -167,4 +167,45 @@
167
167
  }
168
168
  ```
169
169
  (追記)
170
- socketをクライアント端末ごとに用意すればいいと考えGroupOwnerSocketHandler内でArrayList<Socket> socketListを作成し、リスト内のすべてのソケットに対してwrite処理をすればよいと考えたのですがどうでしょうか。
170
+ socketをクライアント端末ごとに用意すればいいと考えGroupOwnerSocketHandler内でArrayList<Socket> socketListを作成し、リスト内のすべてのソケットに対してwrite処理をすればよいと考えたのですがどうでしょうか。
171
+
172
+ ```GroupOwnerSocketHandler
173
+ public class GroupOwnerSocketHandler extends Thread {
174
+ public static ArrayList<Socket> socketList = new ArrayList<Socket>();
175
+ --(略)--
176
+ @Override
177
+ public void run() {
178
+ while (true) {
179
+ try {
180
+ //クライアントごとにsocketをリストで管理
181
+ Socket clientSocket = socket.accept();
182
+ socketList.add(clientSocket);
183
+ pool.execute(new ChatManager(clientSocket, handler));
184
+ Log.d(TAG, "Launching the I/O handler");
185
+
186
+ } catch (IOException e) {
187
+ --(略)--
188
+ }
189
+ }
190
+ }
191
+
192
+ }
193
+ ```
194
+ ```ChatManager
195
+ public class ChatManager implements Runnable {
196
+ --(略)--
197
+ public void write(byte[] buffer) {
198
+ //ソケットの数だけwrite
199
+ for(Iterator<Socket> it = GroupOwnerSocketHandler.socketList.iterator(); it.hasNext();) {
200
+ Socket s = it.next();
201
+ try {
202
+ OutputStream os = s.getOutputStream();
203
+ os.write(buffer);
204
+ } catch (IOException e) {
205
+ Log.e(TAG, "Exception during write", e);
206
+ }
207
+ }
208
+ }
209
+ }
210
+ ```
211
+ このように書き換えたところ、socketListには確かに端末B,Cそれぞれのsocketが別のポートの値で格納されていましたが受信できたのは先に接続した端末Bだけでした。ループ処理も二回実行されていたためwrite自体は2回呼ばれているはずなのですが...

1

追記

2019/05/06 06:19

投稿

Mustard
Mustard

スコア11

title CHANGED
File without changes
body CHANGED
@@ -165,4 +165,6 @@
165
165
  }
166
166
 
167
167
  }
168
- ```
168
+ ```
169
+ (追記)
170
+ socketをクライアント端末ごとに用意すればいいと考えGroupOwnerSocketHandler内でArrayList<Socket> socketListを作成し、リスト内のすべてのソケットに対してwrite処理をすればよいと考えたのですがどうでしょうか。