回答編集履歴
2
ipアドレスの定義を戻し忘れ
test
CHANGED
@@ -63,8 +63,8 @@
|
|
63
63
|
|
64
64
|
ToggleButton toggle = findViewById(R.id.toggleButton);
|
65
65
|
toggle.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
66
|
-
|
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
コード修正
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
|
-
|
6
|
+
|
8
|
-
|
9
|
-
import android.app.Dialog;
|
10
|
-
import android.os.
|
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
|
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
|
-
|
30
|
+
String name1 = result.getString(MyDialogFragment.RESULT_TXTNAME1);
|
28
|
-
|
31
|
+
String name2 = result.getString(MyDialogFragment.RESULT_TXTNAME2);
|
29
|
-
|
32
|
+
String name3 = result.getString(MyDialogFragment.RESULT_TXTNAME3);
|
33
|
+
Log.d(LOG_TAG, "send:" + name1);
|
30
|
-
pw.
|
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
|
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
|
-
|
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
|
-
|
76
|
+
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
60
77
|
pw = new PrintWriter(socket.getOutputStream(), true);
|
61
78
|
pw.println("タブレット端末接続開始");
|
62
|
-
|
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
|
-
|
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
|
+
```
|