質問編集履歴

2

ソースコード変更

2016/01/15 16:06

投稿

kt3302y
kt3302y

スコア27

test CHANGED
File without changes
test CHANGED
@@ -280,7 +280,7 @@
280
280
 
281
281
  }
282
282
 
283
- ``````ChatTask.java
283
+ ```ChatConnectTask.java
284
284
 
285
285
  import android.os.AsyncTask;
286
286
 
@@ -300,12 +300,6 @@
300
300
 
301
301
 
302
302
 
303
- /**
304
-
305
- * Created by 大嗣 on 2016/01/07.
306
-
307
- */
308
-
309
303
  public class ChatConnectTask extends AsyncTask<Param,String,String > {
310
304
 
311
305
  private ChatConnectTaskCallback mCallback;
@@ -456,6 +450,10 @@
456
450
 
457
451
  }
458
452
 
453
+ ```
454
+
455
+
456
+
459
457
  ```ChatSendTask.java
460
458
 
461
459
  import java.io.DataOutputStream;
@@ -470,12 +468,6 @@
470
468
 
471
469
 
472
470
 
473
- /**
474
-
475
- * Created by 大嗣 on 2016/01/07.
476
-
477
- */
478
-
479
471
  public class ChatSendTask extends Thread {
480
472
 
481
473
  private Param param = new Param();

1

質問内容変更

2016/01/15 16:06

投稿

kt3302y
kt3302y

スコア27

test CHANGED
File without changes
test CHANGED
@@ -1,17 +1,591 @@
1
1
  Android Studioを使用してチャットクライアントを作成しています.
2
2
 
3
- チャット受信は可能なのでが,チャト送信がきません.
4
-
5
-
6
-
7
- 本来ならサーバはメッセージを受信するとそのメッセージを表示するはずがAndroidから送信されてきたメッセージを表示しないため,Androidの方が送信できていないのか,CUIサーバの受信機能に問題があるかのどちらかだと思います.
8
-
9
- 補足:PC上で動作するGUIプログラムのチャットクライアントは正常に動作しました.
10
-
11
-
12
-
13
- ソースコードはこちらの質問に投稿されていますので,よろしくお願いします.
14
-
15
- [Android チャットクライアント](https://teratail.com/questions/24281)
16
-
17
- [CUI チャットサーバのソースコード](https://teratail.com/questions/23673)
3
+ public void handleButtonConnectAction(View view)はソケットを接続してバックラウンドでチャット受信待ち状態にるメソ
4
+
5
+ しかしこれを実行すると常にチャットを受信待ちにしなければならないはずが受信待ちのバックラウンド処理がすぐに終了してしまう問題が発生してしまいます.どうすればよいのでしょうか
6
+
7
+ ```MainActivity.java
8
+
9
+ import android.os.Bundle;
10
+
11
+ import android.support.design.widget.FloatingActionButton;
12
+
13
+ import android.support.design.widget.Snackbar;
14
+
15
+ import android.support.v7.app.AppCompatActivity;
16
+
17
+ import android.support.v7.widget.Toolbar;
18
+
19
+ import android.view.View;
20
+
21
+ import android.view.Menu;
22
+
23
+ import android.view.MenuItem;
24
+
25
+ import android.widget.Button;
26
+
27
+ import android.widget.EditText;
28
+
29
+ import android.widget.TextView;
30
+
31
+ import android.widget.Toast;
32
+
33
+
34
+
35
+ import java.io.IOException;
36
+
37
+ import java.net.InetSocketAddress;
38
+
39
+ import java.net.Socket;
40
+
41
+ import java.util.logging.Handler;
42
+
43
+ import java.util.logging.LogRecord;
44
+
45
+
46
+
47
+ public class MainActivity extends AppCompatActivity
48
+
49
+ implements ChatConnectTask.ChatConnectTaskCallback{
50
+
51
+
52
+
53
+ private ChatConnectTask connectTask;
54
+
55
+ private EditText inputIP;
56
+
57
+ private EditText inputPort;
58
+
59
+ private EditText inputMessage;
60
+
61
+ private TextView viewChat;
62
+
63
+ private Button buttonConnect;
64
+
65
+ private Button buttonSend;
66
+
67
+ private Socket socket;
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+ @Override
78
+
79
+ protected void onCreate(Bundle savedInstanceState) {
80
+
81
+ super.onCreate(savedInstanceState);
82
+
83
+ setContentView(R.layout.activity_main);
84
+
85
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
86
+
87
+ setSupportActionBar(toolbar);
88
+
89
+
90
+
91
+ inputIP = (EditText)findViewById(R.id.inputIP);
92
+
93
+ inputPort = (EditText)findViewById(R.id.inputPort);
94
+
95
+ inputMessage = (EditText)findViewById(R.id.inputMessage);
96
+
97
+ buttonConnect = (Button)findViewById(R.id.buttonConnect);
98
+
99
+ buttonSend = (Button)findViewById(R.id.buttonSend);
100
+
101
+ viewChat = (TextView)findViewById(R.id.viewChat);
102
+
103
+
104
+
105
+ FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
106
+
107
+ fab.setOnClickListener(new View.OnClickListener() {
108
+
109
+ @Override
110
+
111
+ public void onClick(View view) {
112
+
113
+ Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
114
+
115
+ .setAction("Action", null).show();
116
+
117
+ }
118
+
119
+ });
120
+
121
+ }
122
+
123
+
124
+
125
+ //connectボタンでソケット接続&メッセージ受信
126
+
127
+ public void handleButtonConnectAction(View view){
128
+
129
+ Toast.makeText(this, "kaisi", Toast.LENGTH_SHORT).show();
130
+
131
+ //IPアドレスを取得
132
+
133
+ String IP = inputIP.getText().toString();
134
+
135
+ //ポート番号を取得
136
+
137
+ int port = Integer.parseInt(inputPort.getText().toString());
138
+
139
+ this.socket = connect(IP,port);
140
+
141
+ Param param = new Param(socket);
142
+
143
+ connectTask = new ChatConnectTask(this);
144
+
145
+ connectTask.execute(param);
146
+
147
+ }
148
+
149
+ //サーバと接続するメソッド
150
+
151
+ protected Socket connect(final String IP, final int port){
152
+
153
+ new Thread(new Runnable(){
154
+
155
+ @Override
156
+
157
+ public void run(){
158
+
159
+ Socket socket = new Socket();
160
+
161
+ try {
162
+
163
+ socket.connect(new InetSocketAddress(IP,port));
164
+
165
+ } catch (IOException e) {
166
+
167
+
168
+
169
+ }
170
+
171
+ }
172
+
173
+ }).start();
174
+
175
+
176
+
177
+ return socket;
178
+
179
+ }
180
+
181
+
182
+
183
+
184
+
185
+ //送信ボタンでメッセージを送信
186
+
187
+ public void handleButtonSendAction(View view){
188
+
189
+ String message = inputMessage.getText().toString();
190
+
191
+ Param param = new Param(socket,message);
192
+
193
+ ChatSendTask sendTask = new ChatSendTask(param);
194
+
195
+ sendTask.start();
196
+
197
+ }
198
+
199
+
200
+
201
+ @Override
202
+
203
+ public boolean onCreateOptionsMenu(Menu menu) {
204
+
205
+ // Inflate the menu; this adds items to the action bar if it is present.
206
+
207
+ getMenuInflater().inflate(R.menu.menu_main, menu);
208
+
209
+ return true;
210
+
211
+ }
212
+
213
+
214
+
215
+ @Override
216
+
217
+ public boolean onOptionsItemSelected(MenuItem item) {
218
+
219
+ // Handle action bar item clicks here. The action bar will
220
+
221
+ // automatically handle clicks on the Home/Up button, so long
222
+
223
+ // as you specify a parent activity in AndroidManifest.xml.
224
+
225
+ int id = item.getItemId();
226
+
227
+
228
+
229
+ //noinspection SimplifiableIfStatement
230
+
231
+ if (id == R.id.action_settings) {
232
+
233
+ return true;
234
+
235
+ }
236
+
237
+
238
+
239
+ return super.onOptionsItemSelected(item);
240
+
241
+ }
242
+
243
+
244
+
245
+ @Override
246
+
247
+ public void onPreExecute() {
248
+
249
+
250
+
251
+ }
252
+
253
+
254
+
255
+ @Override
256
+
257
+ public void onProgressUpdate(String... message) {
258
+
259
+ viewChat.setText(message[0].toString());
260
+
261
+ }
262
+
263
+
264
+
265
+ @Override
266
+
267
+ public void onPostExecute(String result) {
268
+
269
+ Toast.makeText(this,result,Toast.LENGTH_LONG).show();
270
+
271
+ inputMessage.setText("");
272
+
273
+ }
274
+
275
+
276
+
277
+
278
+
279
+
280
+
281
+ }
282
+
283
+ ``````ChatTask.java
284
+
285
+ import android.os.AsyncTask;
286
+
287
+
288
+
289
+ import java.io.DataInputStream;
290
+
291
+
292
+
293
+ import java.io.IOException;
294
+
295
+ import java.io.InputStream;
296
+
297
+
298
+
299
+ import java.net.Socket;
300
+
301
+
302
+
303
+ /**
304
+
305
+ * Created by 大嗣 on 2016/01/07.
306
+
307
+ */
308
+
309
+ public class ChatConnectTask extends AsyncTask<Param,String,String > {
310
+
311
+ private ChatConnectTaskCallback mCallback;
312
+
313
+
314
+
315
+ private String showMessage = " ";//nullConnectと表示させないための処置
316
+
317
+
318
+
319
+ public ChatConnectTask(ChatConnectTaskCallback callback){
320
+
321
+
322
+
323
+ this.mCallback = callback;
324
+
325
+ }
326
+
327
+
328
+
329
+
330
+
331
+
332
+
333
+
334
+
335
+ @Override
336
+
337
+ protected void onPreExecute(){
338
+
339
+ if(mCallback != null)
340
+
341
+ mCallback.onPreExecute();
342
+
343
+ }
344
+
345
+
346
+
347
+ protected String doInBackground(Param... param){
348
+
349
+
350
+
351
+ Socket socket = param[0].param1;
352
+
353
+
354
+
355
+ try {
356
+
357
+
358
+
359
+ while(socket != null) {
360
+
361
+ // 接続されたソケットの入力ストリームを取得し,データ入力ストリームを連結
362
+
363
+ InputStream is = socket.getInputStream();
364
+
365
+ DataInputStream dis = new DataInputStream(is);
366
+
367
+
368
+
369
+
370
+
371
+ // データの受信
372
+
373
+ String receiveMessage = dis.readUTF();
374
+
375
+ //受信したデータに改行をつけてメッセージを追加していく
376
+
377
+ showMessage += receiveMessage + "\r\n";
378
+
379
+ // 受信したデータを表示
380
+
381
+
382
+
383
+ publishProgress(showMessage);
384
+
385
+ }
386
+
387
+
388
+
389
+
390
+
391
+ } catch (Exception e) {
392
+
393
+ e.printStackTrace();
394
+
395
+ } finally {
396
+
397
+ // ソケットをクローズする
398
+
399
+ if (socket != null ) {
400
+
401
+ try {
402
+
403
+ socket.close();
404
+
405
+ } catch (IOException e) {}
406
+
407
+ }
408
+
409
+ }
410
+
411
+
412
+
413
+ return "チャットを終了します";
414
+
415
+ }
416
+
417
+
418
+
419
+ @Override
420
+
421
+ protected void onProgressUpdate(String... message){
422
+
423
+ if(mCallback != null)
424
+
425
+ mCallback.onProgressUpdate(message);
426
+
427
+ }
428
+
429
+
430
+
431
+ @Override
432
+
433
+ protected void onPostExecute(String result ){
434
+
435
+ if(mCallback != null) {
436
+
437
+ mCallback.onPostExecute(result);
438
+
439
+ }
440
+
441
+ }
442
+
443
+
444
+
445
+
446
+
447
+ public interface ChatConnectTaskCallback{
448
+
449
+ void onPreExecute();
450
+
451
+ void onProgressUpdate(String... message);
452
+
453
+ void onPostExecute(String result);
454
+
455
+ }
456
+
457
+ }
458
+
459
+ ```ChatSendTask.java
460
+
461
+ import java.io.DataOutputStream;
462
+
463
+ import java.io.IOException;
464
+
465
+ import java.io.OutputStream;
466
+
467
+ import java.net.InetSocketAddress;
468
+
469
+ import java.net.Socket;
470
+
471
+
472
+
473
+ /**
474
+
475
+ * Created by 大嗣 on 2016/01/07.
476
+
477
+ */
478
+
479
+ public class ChatSendTask extends Thread {
480
+
481
+ private Param param = new Param();
482
+
483
+
484
+
485
+ public ChatSendTask(Param... params){
486
+
487
+ this.param.param1 = params[0].param1;
488
+
489
+ this.param.param2 = params[0].param2;
490
+
491
+ }
492
+
493
+
494
+
495
+ public void run(){
496
+
497
+
498
+
499
+ try {
500
+
501
+
502
+
503
+ // 接続されたソケットの出力力ストリームを取得し,データ出力ストリームを連結
504
+
505
+ OutputStream os = param.param1.getOutputStream();
506
+
507
+ DataOutputStream dos = new DataOutputStream(os);
508
+
509
+ // テキストフィールドの文字を取得
510
+
511
+ String sendMessage = param.param2;
512
+
513
+ //データの送信
514
+
515
+ dos.writeUTF(sendMessage);
516
+
517
+ dos.flush();
518
+
519
+
520
+
521
+
522
+
523
+ } catch (Exception e) {
524
+
525
+ e.printStackTrace();
526
+
527
+ } finally {
528
+
529
+ // ソケットをクローズする
530
+
531
+ if (param.param1 != null) {
532
+
533
+ try {
534
+
535
+ param.param1.close();
536
+
537
+ } catch (IOException e) {}
538
+
539
+ }
540
+
541
+ }
542
+
543
+ }
544
+
545
+
546
+
547
+ }
548
+
549
+ ```Param.java
550
+
551
+ import java.net.Socket;
552
+
553
+
554
+
555
+
556
+
557
+ public class Param {
558
+
559
+ Socket param1;
560
+
561
+ String param2;
562
+
563
+
564
+
565
+
566
+
567
+ Param(Socket param1,String param2){
568
+
569
+ this.param1 = param1;
570
+
571
+ this.param2 = param2;
572
+
573
+ }
574
+
575
+ Param(Socket param1){
576
+
577
+ this(param1,null);
578
+
579
+ }
580
+
581
+ Param(){
582
+
583
+ this(null,null);
584
+
585
+ }
586
+
587
+
588
+
589
+ }
590
+
591
+ ```