質問編集履歴
4
タグ変更
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|
3
追記
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
追記
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
追記
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処理をすればよいと考えたのですがどうでしょうか。
|