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

質問編集履歴

2

ソースコード変更

2016/01/15 16:06

投稿

kt3302y
kt3302y

スコア27

title CHANGED
File without changes
body CHANGED
@@ -139,7 +139,7 @@
139
139
 
140
140
 
141
141
  }
142
- ``````ChatTask.java
142
+ ```ChatConnectTask.java
143
143
  import android.os.AsyncTask;
144
144
 
145
145
  import java.io.DataInputStream;
@@ -149,9 +149,6 @@
149
149
 
150
150
  import java.net.Socket;
151
151
 
152
- /**
153
- * Created by 大嗣 on 2016/01/07.
154
- */
155
152
  public class ChatConnectTask extends AsyncTask<Param,String,String > {
156
153
  private ChatConnectTaskCallback mCallback;
157
154
 
@@ -227,6 +224,8 @@
227
224
  void onPostExecute(String result);
228
225
  }
229
226
  }
227
+ ```
228
+
230
229
  ```ChatSendTask.java
231
230
  import java.io.DataOutputStream;
232
231
  import java.io.IOException;
@@ -234,9 +233,6 @@
234
233
  import java.net.InetSocketAddress;
235
234
  import java.net.Socket;
236
235
 
237
- /**
238
- * Created by 大嗣 on 2016/01/07.
239
- */
240
236
  public class ChatSendTask extends Thread {
241
237
  private Param param = new Param();
242
238
 

1

質問内容変更

2016/01/15 16:06

投稿

kt3302y
kt3302y

スコア27

title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,296 @@
1
1
  Android Studioを使用してチャットクライアントを作成しています.
2
+ public void handleButtonConnectAction(View view)はソケットを接続してバックラウンドでチャットを受信待ち状態にするメソッドです
3
+ しかしこれを実行すると常にチャットを受信待ちにしなければならないはずが受信待ちのバックラウンド処理がすぐに終了してしまう問題が発生してしまいます.どうすればよいのでしょうか
4
+ ```MainActivity.java
5
+ import android.os.Bundle;
6
+ import android.support.design.widget.FloatingActionButton;
7
+ import android.support.design.widget.Snackbar;
8
+ import android.support.v7.app.AppCompatActivity;
9
+ import android.support.v7.widget.Toolbar;
10
+ import android.view.View;
11
+ import android.view.Menu;
2
- チャットの受信は可能なのですが,チャット送信ができません.
12
+ import android.view.MenuItem;
13
+ import android.widget.Button;
14
+ import android.widget.EditText;
15
+ import android.widget.TextView;
16
+ import android.widget.Toast;
3
17
 
18
+ import java.io.IOException;
4
- 本来ならサーバはメッセージを受信するとそのメッセージを表示するはずがAndroidから送信されてきたメッセージを表示しないため,Androidの方が送信できていないのか,CUIサーバの受信機能に問題があるかのどちらかだと思います.
19
+ import java.net.InetSocketAddress;
20
+ import java.net.Socket;
21
+ import java.util.logging.Handler;
5
- 補足:PC上で動作するGUIプログラムのチャットクライアントは正常に動作しました.
22
+ import java.util.logging.LogRecord;
6
23
 
24
+ public class MainActivity extends AppCompatActivity
25
+ implements ChatConnectTask.ChatConnectTaskCallback{
26
+
7
- ソースコードはこちらの質問に投稿されていますので,よろしくお願いします.
27
+ private ChatConnectTask connectTask;
28
+ private EditText inputIP;
29
+ private EditText inputPort;
30
+ private EditText inputMessage;
31
+ private TextView viewChat;
32
+ private Button buttonConnect;
33
+ private Button buttonSend;
34
+ private Socket socket;
35
+
36
+
37
+
38
+
39
+ @Override
40
+ protected void onCreate(Bundle savedInstanceState) {
41
+ super.onCreate(savedInstanceState);
42
+ setContentView(R.layout.activity_main);
43
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
44
+ setSupportActionBar(toolbar);
45
+
46
+ inputIP = (EditText)findViewById(R.id.inputIP);
47
+ inputPort = (EditText)findViewById(R.id.inputPort);
48
+ inputMessage = (EditText)findViewById(R.id.inputMessage);
49
+ buttonConnect = (Button)findViewById(R.id.buttonConnect);
50
+ buttonSend = (Button)findViewById(R.id.buttonSend);
51
+ viewChat = (TextView)findViewById(R.id.viewChat);
52
+
53
+ FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
54
+ fab.setOnClickListener(new View.OnClickListener() {
55
+ @Override
56
+ public void onClick(View view) {
57
+ Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
58
+ .setAction("Action", null).show();
59
+ }
60
+ });
61
+ }
62
+
63
+ //connectボタンでソケット接続&メッセージ受信
64
+ public void handleButtonConnectAction(View view){
65
+ Toast.makeText(this, "kaisi", Toast.LENGTH_SHORT).show();
66
+ //IPアドレスを取得
67
+ String IP = inputIP.getText().toString();
68
+ //ポート番号を取得
69
+ int port = Integer.parseInt(inputPort.getText().toString());
70
+ this.socket = connect(IP,port);
71
+ Param param = new Param(socket);
72
+ connectTask = new ChatConnectTask(this);
73
+ connectTask.execute(param);
74
+ }
75
+ //サーバと接続するメソッド
76
+ protected Socket connect(final String IP, final int port){
77
+ new Thread(new Runnable(){
78
+ @Override
79
+ public void run(){
80
+ Socket socket = new Socket();
81
+ try {
82
+ socket.connect(new InetSocketAddress(IP,port));
83
+ } catch (IOException e) {
84
+
85
+ }
86
+ }
87
+ }).start();
88
+
89
+ return socket;
90
+ }
91
+
92
+
93
+ //送信ボタンでメッセージを送信
94
+ public void handleButtonSendAction(View view){
95
+ String message = inputMessage.getText().toString();
96
+ Param param = new Param(socket,message);
97
+ ChatSendTask sendTask = new ChatSendTask(param);
98
+ sendTask.start();
99
+ }
100
+
101
+ @Override
102
+ public boolean onCreateOptionsMenu(Menu menu) {
103
+ // Inflate the menu; this adds items to the action bar if it is present.
104
+ getMenuInflater().inflate(R.menu.menu_main, menu);
105
+ return true;
106
+ }
107
+
108
+ @Override
109
+ public boolean onOptionsItemSelected(MenuItem item) {
110
+ // Handle action bar item clicks here. The action bar will
111
+ // automatically handle clicks on the Home/Up button, so long
112
+ // as you specify a parent activity in AndroidManifest.xml.
113
+ int id = item.getItemId();
114
+
115
+ //noinspection SimplifiableIfStatement
116
+ if (id == R.id.action_settings) {
117
+ return true;
118
+ }
119
+
120
+ return super.onOptionsItemSelected(item);
121
+ }
122
+
123
+ @Override
124
+ public void onPreExecute() {
125
+
126
+ }
127
+
128
+ @Override
129
+ public void onProgressUpdate(String... message) {
130
+ viewChat.setText(message[0].toString());
131
+ }
132
+
133
+ @Override
134
+ public void onPostExecute(String result) {
135
+ Toast.makeText(this,result,Toast.LENGTH_LONG).show();
136
+ inputMessage.setText("");
137
+ }
138
+
139
+
140
+
141
+ }
142
+ ``````ChatTask.java
143
+ import android.os.AsyncTask;
144
+
145
+ import java.io.DataInputStream;
146
+
147
+ import java.io.IOException;
148
+ import java.io.InputStream;
149
+
150
+ import java.net.Socket;
151
+
152
+ /**
153
+ * Created by 大嗣 on 2016/01/07.
154
+ */
155
+ public class ChatConnectTask extends AsyncTask<Param,String,String > {
156
+ private ChatConnectTaskCallback mCallback;
157
+
8
- [Android チャットクライアント](https://teratail.com/questions/24281)
158
+ private String showMessage = " ";//nullConnectと表示させないための処置
159
+
160
+ public ChatConnectTask(ChatConnectTaskCallback callback){
161
+
162
+ this.mCallback = callback;
163
+ }
164
+
165
+
166
+
167
+
168
+ @Override
169
+ protected void onPreExecute(){
170
+ if(mCallback != null)
171
+ mCallback.onPreExecute();
172
+ }
173
+
174
+ protected String doInBackground(Param... param){
175
+
176
+ Socket socket = param[0].param1;
177
+
178
+ try {
179
+
180
+ while(socket != null) {
181
+ // 接続されたソケットの入力ストリームを取得し,データ入力ストリームを連結
182
+ InputStream is = socket.getInputStream();
183
+ DataInputStream dis = new DataInputStream(is);
184
+
185
+
186
+ // データの受信
187
+ String receiveMessage = dis.readUTF();
188
+ //受信したデータに改行をつけてメッセージを追加していく
189
+ showMessage += receiveMessage + "\r\n";
190
+ // 受信したデータを表示
191
+
192
+ publishProgress(showMessage);
193
+ }
194
+
195
+
196
+ } catch (Exception e) {
197
+ e.printStackTrace();
198
+ } finally {
199
+ // ソケットをクローズする
200
+ if (socket != null ) {
201
+ try {
202
+ socket.close();
203
+ } catch (IOException e) {}
204
+ }
205
+ }
206
+
207
+ return "チャットを終了します";
208
+ }
209
+
210
+ @Override
211
+ protected void onProgressUpdate(String... message){
212
+ if(mCallback != null)
213
+ mCallback.onProgressUpdate(message);
214
+ }
215
+
216
+ @Override
217
+ protected void onPostExecute(String result ){
218
+ if(mCallback != null) {
219
+ mCallback.onPostExecute(result);
220
+ }
221
+ }
222
+
223
+
224
+ public interface ChatConnectTaskCallback{
225
+ void onPreExecute();
226
+ void onProgressUpdate(String... message);
227
+ void onPostExecute(String result);
228
+ }
229
+ }
230
+ ```ChatSendTask.java
231
+ import java.io.DataOutputStream;
232
+ import java.io.IOException;
233
+ import java.io.OutputStream;
234
+ import java.net.InetSocketAddress;
235
+ import java.net.Socket;
236
+
237
+ /**
238
+ * Created by 大嗣 on 2016/01/07.
239
+ */
240
+ public class ChatSendTask extends Thread {
241
+ private Param param = new Param();
242
+
243
+ public ChatSendTask(Param... params){
244
+ this.param.param1 = params[0].param1;
245
+ this.param.param2 = params[0].param2;
246
+ }
247
+
248
+ public void run(){
249
+
250
+ try {
251
+
9
- [CUI チャットサーバースド](https://teratail.com/questions/23673)
252
+ // 接続されたソケットの出力力ストリムを取得し,データ出力トリムを連結
253
+ OutputStream os = param.param1.getOutputStream();
254
+ DataOutputStream dos = new DataOutputStream(os);
255
+ // テキストフィールドの文字を取得
256
+ String sendMessage = param.param2;
257
+ //データの送信
258
+ dos.writeUTF(sendMessage);
259
+ dos.flush();
260
+
261
+
262
+ } catch (Exception e) {
263
+ e.printStackTrace();
264
+ } finally {
265
+ // ソケットをクローズする
266
+ if (param.param1 != null) {
267
+ try {
268
+ param.param1.close();
269
+ } catch (IOException e) {}
270
+ }
271
+ }
272
+ }
273
+
274
+ }
275
+ ```Param.java
276
+ import java.net.Socket;
277
+
278
+
279
+ public class Param {
280
+ Socket param1;
281
+ String param2;
282
+
283
+
284
+ Param(Socket param1,String param2){
285
+ this.param1 = param1;
286
+ this.param2 = param2;
287
+ }
288
+ Param(Socket param1){
289
+ this(param1,null);
290
+ }
291
+ Param(){
292
+ this(null,null);
293
+ }
294
+
295
+ }
296
+ ```