回答編集履歴

2

ipアドレスの定義を戻し忘れ

2022/06/06 08:23

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -63,8 +63,8 @@
63
63
 
64
64
  ToggleButton toggle = findViewById(R.id.toggleButton);
65
65
  toggle.setOnCheckedChangeListener((buttonView, isChecked) -> {
66
- //String ip = "10.22.18.109";
66
+ String ip = "10.22.18.109";
67
- String ip = "10.0.2.2"; //エミュレータホスト
67
+ //String ip = "10.0.2.2"; //エミュレータホスト
68
68
  int port = 50015;
69
69
  InetSocketAddress address = new InetSocketAddress(ip, port);
70
70
  socket = new Socket();

1

コード修正

2022/06/06 08:22

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -1,21 +1,23 @@
1
1
  例えば、 Thread で接続した結果として PrintWriter をフィールドにし、 DialogFragment が OK されたら FragmentResultListener 経由で Main で出力というのは如何でしょう。
2
2
 
3
- ※ 以下は動作確認はしていません。
3
+ MainActivity.java
4
4
  ```java
5
- import androidx.annotation.NonNull;
6
5
  import androidx.appcompat.app.*;
7
- import androidx.fragment.app.DialogFragment;
6
+
8
-
9
- import android.app.Dialog;
10
- import android.os.Bundle;
7
+ import android.os.*;
8
+ import android.util.Log;
11
9
  import android.widget.*;
12
10
 
13
11
  import java.io.*;
14
12
  import java.net.*;
15
13
 
16
14
  public class MainActivity extends AppCompatActivity {
15
+ public static final String LOG_TAG = "MainActivity";
17
16
  private static String CONFIRM_SEND_REQUESTKEY = "confirmSend";
17
+
18
+ private Socket socket;
19
+ private BufferedReader br;
18
- private PrintWriter pw = null;
20
+ private PrintWriter pw;
19
21
 
20
22
  @Override
21
23
  protected void onCreate(Bundle savedInstanceState) {
@@ -23,14 +25,27 @@
23
25
  setContentView(R.layout.activity_main);
24
26
 
25
27
  getSupportFragmentManager().setFragmentResultListener(CONFIRM_SEND_REQUESTKEY, this, (requestKey, result) -> {
28
+ new Thread (() -> {
26
- try {
29
+ try {
27
- pw.println(result.getString(MyDialogFragment.RESULT_TXTNAME1));
30
+ String name1 = result.getString(MyDialogFragment.RESULT_TXTNAME1);
28
- pw.println(result.getString(MyDialogFragment.RESULT_TXTNAME2));
31
+ String name2 = result.getString(MyDialogFragment.RESULT_TXTNAME2);
29
- pw.println(result.getString(MyDialogFragment.RESULT_TXTNAME3));
32
+ String name3 = result.getString(MyDialogFragment.RESULT_TXTNAME3);
33
+ Log.d(LOG_TAG, "send:" + name1);
30
- pw.flush();
34
+ pw.println(name1);
35
+ String line = br.readLine();
36
+ if(!line.endsWith(":OK")) Log.e(LOG_TAG, "Error: "+line);
37
+ Log.d(LOG_TAG, "send:" + name2);
38
+ pw.println(name2);
39
+ line = br.readLine();
40
+ if(!line.endsWith(":OK")) Log.e(LOG_TAG, "Error: "+line);
41
+ Log.d(LOG_TAG, "send:" + name3);
42
+ pw.println(name3);
43
+ line = br.readLine();
44
+ if(!line.endsWith(":OK")) Log.e(LOG_TAG, "Error: "+line);
31
- } catch (Exception e) {
45
+ } catch(IOException e) {
32
- e.printStackTrace();
46
+ e.printStackTrace();
33
- }
47
+ }
48
+ }).start();
34
49
  });
35
50
 
36
51
  EditText txtName1 = findViewById(R.id.editText1);
@@ -47,39 +62,64 @@
47
62
  });
48
63
 
49
64
  ToggleButton toggle = findViewById(R.id.toggleButton);
50
- toggle.setOnCheckedChangeListener((buttonView, isChecked) ->{
65
+ toggle.setOnCheckedChangeListener((buttonView, isChecked) -> {
51
- String ip = "10.22.18.109";
66
+ //String ip = "10.22.18.109";
67
+ String ip = "10.0.2.2"; //エミュレータホスト
52
68
  int port = 50015;
53
69
  InetSocketAddress address = new InetSocketAddress(ip, port);
54
- Socket socket = new Socket();
70
+ socket = new Socket();
55
71
  if (isChecked) {
72
+ Log.d(LOG_TAG, "connect start");
56
73
  new Thread (() -> {
57
74
  try {
58
75
  socket.connect(address, 3000);
59
- MainActivity.this.runOnUiThread(() -> Toast.makeText(MainActivity.this, "接続に成功しました。", Toast.LENGTH_LONG).show());
76
+ br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
60
77
  pw = new PrintWriter(socket.getOutputStream(), true);
61
78
  pw.println("タブレット端末接続開始");
62
- pw.flush();
79
+ String line = br.readLine();
80
+ if(line.endsWith(":OK")) {
81
+ MainActivity.this.runOnUiThread(() -> {
82
+ Log.d(LOG_TAG, "接続に成功しました。");
83
+ Toast.makeText(MainActivity.this, "接続に成功しました。", Toast.LENGTH_LONG).show();
63
- btn.setEnabled(true);
84
+ btn.setEnabled(true);
85
+ });
86
+ } else {
87
+ throw new IOException(line);
88
+ }
64
89
  } catch (Exception e) {
90
+ Log.d(LOG_TAG, "接続に失敗しました。");
65
91
  MainActivity.this.runOnUiThread(() -> Toast.makeText(MainActivity.this, "接続に失敗しました。", Toast.LENGTH_LONG).show());
66
92
  e.printStackTrace();
67
93
  }
68
94
  }).start();
69
95
  } else {
96
+ Log.d(LOG_TAG, "disconnect start");
70
97
  btn.setEnabled(false);
71
98
  try {
99
+ br.close();
100
+ } catch (IOException ignore) {}
101
+ pw.close();
102
+ try {
72
103
  socket.close();
73
- } catch (IOException e) {
104
+ } catch (IOException ignore) {}
74
- e.printStackTrace();
105
+ socket = null;
75
- }
76
106
  pw = null;
107
+ br = null;
77
108
  }
78
109
  });
79
110
  }
80
111
  }
81
-
112
+ ```
113
+ MyDialogFragment.java
114
+ ```java
115
+ import android.app.Dialog;
116
+ import android.os.Bundle;
117
+
118
+ import androidx.annotation.NonNull;
119
+ import androidx.appcompat.app.AlertDialog;
120
+ import androidx.fragment.app.DialogFragment;
121
+
82
- class MyDialogFragment extends DialogFragment {
122
+ public class MyDialogFragment extends DialogFragment {
83
123
  static final String RESULT_TXTNAME1 = "txtName1";
84
124
  static final String RESULT_TXTNAME2 = "txtName2";
85
125
  static final String RESULT_TXTNAME3 = "txtName3";
@@ -108,19 +148,60 @@
108
148
  String txtName2 = args.getString(PARAM_TXTNAME2);
109
149
  String txtName3 = args.getString(PARAM_TXTNAME3);
110
150
 
111
- return new AlertDialog.Builder(requireActivity())
151
+ return new AlertDialog.Builder(requireActivity()).setTitle("!!最終確認!!")
112
- .setTitle("!!最終確認!!")
113
152
  //.setIcon(R.drawable.chuui)
114
- .setMessage(String.format("X座標 : %30s\n\n" + "Y座標 : %30s\n\n" + "Z座標 : %30s", txtName1, txtName2, txtName3))
153
+ .setMessage(String.format("X座標 : %30s\n\n" + "Y座標 : %30s\n\n" + "Z座標 : %30s", txtName1, txtName2, txtName3)).setPositiveButton("OK", (dialog, id) -> {
115
- .setPositiveButton("OK", (dialog, id) -> {
116
154
  Bundle result = new Bundle();
117
155
  result.putString(PARAM_TXTNAME1, txtName1);
118
156
  result.putString(PARAM_TXTNAME2, txtName2);
119
157
  result.putString(PARAM_TXTNAME3, txtName3);
120
158
  getParentFragmentManager().setFragmentResult(requestKey, result);
121
- })
122
- .setNegativeButton("キャンセル", null)
159
+ }).setNegativeButton("キャンセル", null).create();
123
- .create();
124
160
  }
125
161
  }
126
162
  ```
163
+
164
+ 以下はテストに使用したサーバプログラムです。
165
+ ```java
166
+ import java.io.*;
167
+ import java.net.ServerSocket;
168
+ import java.net.Socket;
169
+
170
+ public class Server {
171
+ public static void main(String[] args) throws IOException {
172
+ try(ServerSocket ss = new ServerSocket(50015);) {
173
+ System.out.println("start.");
174
+ try(Socket client = ss.accept();
175
+ BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
176
+ PrintWriter pw = new PrintWriter(client.getOutputStream(), true);) {
177
+ for(String line; (line = br.readLine()) != null; ) {
178
+ System.out.println("[client] " + line);
179
+ pw.println(line + ":OK");
180
+ }
181
+ }
182
+ System.out.println("end.");
183
+ }
184
+ }
185
+ }
186
+ ```
187
+ 実行操作
188
+ トグル ON → X:10, Y:12, Z:14 を入力 → SEND 押下 → ダイアログ OK 押下 → トグル OFF
189
+
190
+ 実行結果(クライアント側ログ)
191
+ ```plain
192
+ D/MainActivity: connect start
193
+ D/MainActivity: 接続に成功しました。
194
+ D/MainActivity: send:10
195
+ D/MainActivity: send:12
196
+ D/MainActivity: send:14
197
+ D/MainActivity: disconnect start
198
+ ```
199
+ 実行結果(サーバ側)
200
+ ```plain
201
+ start.
202
+ [client] タブレット端末接続開始
203
+ [client] 10
204
+ [client] 12
205
+ [client] 14
206
+ end.
207
+ ```