質問編集履歴

4

タグ変更

2019/05/10 15:00

投稿

Mustard
Mustard

スコア11

test CHANGED
File without changes
test CHANGED
File without changes

3

追記

2019/05/10 15:00

投稿

Mustard
Mustard

スコア11

test CHANGED
File without changes
test CHANGED
@@ -419,3 +419,107 @@
419
419
  ```
420
420
 
421
421
  このように書き換えたところ、socketListには確かに端末B,Cそれぞれのsocketが別のポートの値で格納されていましたが受信できたのは先に接続した端末Bだけでした。ループ処理も二回実行されていたためwrite自体は2回呼ばれているはずなのですが...
422
+
423
+
424
+
425
+ (追記2)
426
+
427
+ ```GroupOwnerSocketHandler
428
+
429
+ public class GroupOwnerSocketHandler extends Thread {
430
+
431
+ public static ArrayList<ChatManager> chatList = new ArrayList<ChatManager>();
432
+
433
+ --(略)--
434
+
435
+ @Override
436
+
437
+ public void run() {
438
+
439
+ while (true) {
440
+
441
+ try {
442
+
443
+ //クライアントごとにsocketをリストで管理
444
+
445
+ Socket clientSocket = socket.accept();
446
+
447
+ ChatManager clientChat = new ChatManager(clientSocket, handler);
448
+
449
+ chatList.add(clientChat);
450
+
451
+ pool.execute(clientChat);
452
+
453
+ Log.d(TAG, "Launching the I/O handler");
454
+
455
+ } catch (IOException e) {
456
+
457
+ --(略)--
458
+
459
+ }
460
+
461
+ }
462
+
463
+ }
464
+
465
+ }
466
+
467
+ ```
468
+
469
+ とすることで複数の端末に送信することができました。
470
+
471
+ ですが今度は同じ端末に対して一度しか送信がされなくなってしまいました。(端末AからB,Cに対して一度ずつ送信を確認)
472
+
473
+ ChatManagerを配列として管理したので更新が正常に行われていないのではないかと考えています。
474
+
475
+ ChatManagerからhandler.obtainMessageを受け取った際のアクティビティの処理は以下のようになっていました。
476
+
477
+ ```WiFiServiceDiscoveryActivity
478
+
479
+ @Override
480
+
481
+ public boolean handleMessage(Message msg) {
482
+
483
+ switch (msg.what) {
484
+
485
+ case MESSAGE_READ:
486
+
487
+ byte[] readBuf = (byte[]) msg.obj;
488
+
489
+ // construct a string from the valid bytes in the buffer
490
+
491
+ String readMessage = new String(readBuf, 0, msg.arg1);
492
+
493
+ Log.d(TAG, readMessage);
494
+
495
+ (chatFragment).pushMessage("Buddy: " + readMessage);
496
+
497
+ break;
498
+
499
+
500
+
501
+ case MY_HANDLE:
502
+
503
+ Object obj = msg.obj;
504
+
505
+ (chatFragment).setChatManager((ChatManager) obj);
506
+
507
+
508
+
509
+ }
510
+
511
+ return true;
512
+
513
+ }
514
+
515
+ ```
516
+
517
+ ```setChatManager
518
+
519
+ public void setChatManager(ChatManager obj) {
520
+
521
+ chatManager = obj;
522
+
523
+ }
524
+
525
+ ```

2

追記

2019/05/09 14:54

投稿

Mustard
Mustard

スコア11

test CHANGED
File without changes
test CHANGED
@@ -337,3 +337,85 @@
337
337
  (追記)
338
338
 
339
339
  socketをクライアント端末ごとに用意すればいいと考えGroupOwnerSocketHandler内でArrayList<Socket> socketListを作成し、リスト内のすべてのソケットに対してwrite処理をすればよいと考えたのですがどうでしょうか。
340
+
341
+
342
+
343
+ ```GroupOwnerSocketHandler
344
+
345
+ public class GroupOwnerSocketHandler extends Thread {
346
+
347
+ public static ArrayList<Socket> socketList = new ArrayList<Socket>();
348
+
349
+ --(略)--
350
+
351
+ @Override
352
+
353
+ public void run() {
354
+
355
+ while (true) {
356
+
357
+ try {
358
+
359
+ //クライアントごとにsocketをリストで管理
360
+
361
+ Socket clientSocket = socket.accept();
362
+
363
+ socketList.add(clientSocket);
364
+
365
+ pool.execute(new ChatManager(clientSocket, handler));
366
+
367
+ Log.d(TAG, "Launching the I/O handler");
368
+
369
+
370
+
371
+ } catch (IOException e) {
372
+
373
+ --(略)--
374
+
375
+ }
376
+
377
+ }
378
+
379
+ }
380
+
381
+
382
+
383
+ }
384
+
385
+ ```
386
+
387
+ ```ChatManager
388
+
389
+ public class ChatManager implements Runnable {
390
+
391
+ --(略)--
392
+
393
+ public void write(byte[] buffer) {
394
+
395
+ //ソケットの数だけwrite
396
+
397
+ for(Iterator<Socket> it = GroupOwnerSocketHandler.socketList.iterator(); it.hasNext();) {
398
+
399
+ Socket s = it.next();
400
+
401
+ try {
402
+
403
+ OutputStream os = s.getOutputStream();
404
+
405
+ os.write(buffer);
406
+
407
+ } catch (IOException e) {
408
+
409
+ Log.e(TAG, "Exception during write", e);
410
+
411
+ }
412
+
413
+ }
414
+
415
+ }
416
+
417
+ }
418
+
419
+ ```
420
+
421
+ このように書き換えたところ、socketListには確かに端末B,Cそれぞれのsocketが別のポートの値で格納されていましたが受信できたのは先に接続した端末Bだけでした。ループ処理も二回実行されていたためwrite自体は2回呼ばれているはずなのですが...

1

追記

2019/05/06 06:19

投稿

Mustard
Mustard

スコア11

test CHANGED
File without changes
test CHANGED
@@ -333,3 +333,7 @@
333
333
  }
334
334
 
335
335
  ```
336
+
337
+ (追記)
338
+
339
+ socketをクライアント端末ごとに用意すればいいと考えGroupOwnerSocketHandler内でArrayList<Socket> socketListを作成し、リスト内のすべてのソケットに対してwrite処理をすればよいと考えたのですがどうでしょうか。