質問編集履歴
1
エラーの詳細を記述しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,37 +8,135 @@
|
|
8
8
|
|
9
9
|
サーバとクライアントの接続切れの判定について、理解の難しい挙動があったため質問いたします。このような挙動がなぜ起こるのかをご教授いただきたいです。
|
10
10
|
|
11
|
+
```java
|
12
|
+
|
13
|
+
import java.io.BufferedReader;
|
14
|
+
|
15
|
+
import java.io.IOException;
|
16
|
+
|
17
|
+
import java.io.InputStreamReader;
|
18
|
+
|
19
|
+
import java.io.PrintWriter;
|
20
|
+
|
21
|
+
import java.net.Socket;
|
22
|
+
|
23
|
+
import java.net.UnknownHostException;
|
11
24
|
|
12
25
|
|
26
|
+
|
27
|
+
public class SimpleClient {
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
public static void main(String[] args) {
|
32
|
+
|
33
|
+
Socket s;
|
34
|
+
|
35
|
+
try {
|
36
|
+
|
37
|
+
s = new Socket("localhost", 10000);//パソコン2台のときは"localhost"を"192.168."から始まるプライベートIPアドレスに
|
38
|
+
|
39
|
+
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
|
40
|
+
|
41
|
+
InputStreamReader sisr = new InputStreamReader(s.getInputStream());
|
42
|
+
|
43
|
+
BufferedReader br_in = new BufferedReader(sisr);
|
44
|
+
|
45
|
+
BufferedReader br_out = new BufferedReader(new InputStreamReader(System.in), 1);
|
46
|
+
|
47
|
+
while(true) {
|
48
|
+
|
49
|
+
System.out.println("サーバへの入力");
|
50
|
+
|
51
|
+
out.println(br_out.readLine());
|
52
|
+
|
53
|
+
//System.out.println("サーバからの出力");
|
54
|
+
|
55
|
+
//System.out.println(br_in.readLine());
|
56
|
+
|
57
|
+
}
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
} catch (UnknownHostException e) {
|
62
|
+
|
63
|
+
// TODO 自動生成された catch ブロック
|
64
|
+
|
65
|
+
e.printStackTrace();
|
66
|
+
|
67
|
+
} catch (IOException e) {
|
68
|
+
|
69
|
+
// TODO 自動生成された catch ブロック
|
70
|
+
|
71
|
+
e.printStackTrace();
|
72
|
+
|
73
|
+
} //サーバ(ipAddress, port)に接続
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
}
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
}
|
84
|
+
|
85
|
+
```
|
86
|
+
|
13
|
-
以下のようなサーバプログラムで、**br.readLine()**が**IOException**を投げるかどうかでクライアントとの接続切れを判定していました。
|
87
|
+
上記のようなクライアントプログラムと、以下のようなサーバプログラムで、**br.readLine()**が**IOException**を投げるかどうかでクライアントとの接続切れを判定していました。
|
14
88
|
|
15
89
|
```java
|
16
90
|
|
17
|
-
|
91
|
+
import java.io.BufferedReader;
|
18
92
|
|
19
|
-
|
93
|
+
import java.io.IOException;
|
20
94
|
|
21
|
-
|
95
|
+
import java.io.InputStreamReader;
|
22
96
|
|
23
|
-
|
97
|
+
import java.net.ServerSocket;
|
24
98
|
|
25
|
-
t
|
99
|
+
import java.net.Socket;
|
26
100
|
|
27
|
-
while(true) {// データを受信し続ける
|
28
101
|
|
29
|
-
String inputLine;
|
30
102
|
|
31
|
-
|
103
|
+
public class Servertest {
|
32
104
|
|
33
|
-
|
105
|
+
public static void main(String[] args){
|
34
106
|
|
35
|
-
|
107
|
+
ServerSocket ss;
|
36
108
|
|
37
|
-
|
109
|
+
try {
|
38
110
|
|
39
|
-
|
111
|
+
ss = new ServerSocket(10000);
|
40
112
|
|
113
|
+
Socket socket = ss.accept();
|
114
|
+
|
115
|
+
InputStreamReader sisr = new InputStreamReader(socket.getInputStream());
|
116
|
+
|
117
|
+
BufferedReader br = new BufferedReader(sisr);
|
118
|
+
|
119
|
+
while(true) {// データを受信し続ける
|
120
|
+
|
121
|
+
String inputLine;
|
122
|
+
|
123
|
+
inputLine = br.readLine();
|
124
|
+
|
125
|
+
System.out.println(inputLine);
|
126
|
+
|
127
|
+
}
|
128
|
+
|
129
|
+
} catch (IOException e1) {
|
130
|
+
|
131
|
+
// TODO 自動生成された catch ブロック
|
132
|
+
|
41
|
-
|
133
|
+
e1.printStackTrace();
|
134
|
+
|
135
|
+
}
|
136
|
+
|
137
|
+
}
|
138
|
+
|
139
|
+
|
42
140
|
|
43
141
|
}
|
44
142
|
|
@@ -46,7 +144,37 @@
|
|
46
144
|
|
47
145
|
しかし、一つのパソコンでサーバとクライアントのプログラムを起動したときはうまくいったのですが、サーバとクライアントを別のパソコンで起動したときは**br.readLine()**が例外を投げずに、**null**を返してそのまま処理が続行してしまいました。
|
48
146
|
|
147
|
+
### 発生している問題・エラーメッセージ
|
49
148
|
|
149
|
+
localhostで実行した場合は、クライアントのコマンドプロンプトでctrl+Cを押して、クライアントプログラムを終了すると、以下のように例外を投げます
|
150
|
+
|
151
|
+
```
|
152
|
+
|
153
|
+
java.net.SocketException: Connection reset
|
154
|
+
|
155
|
+
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:186)
|
156
|
+
|
157
|
+
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
|
158
|
+
|
159
|
+
at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
|
160
|
+
|
161
|
+
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
|
162
|
+
|
163
|
+
at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
|
164
|
+
|
165
|
+
at java.base/java.io.InputStreamReader.read(InputStreamReader.java:185)
|
166
|
+
|
167
|
+
at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
|
168
|
+
|
169
|
+
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
|
170
|
+
|
171
|
+
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
|
172
|
+
|
173
|
+
at server.Servertest.main(Servertest.java:19)
|
174
|
+
|
175
|
+
```
|
176
|
+
|
177
|
+
しかしながら、2台のパソコンの時は、上記のように例外が投げられず、**null**が無限ループで表示されました。
|
50
178
|
|
51
179
|
どうして、このような挙動になるのか教えていただけると幸いです
|
52
180
|
|
@@ -56,10 +184,16 @@
|
|
56
184
|
|
57
185
|
### 補足情報(FW/ツールのバージョンなど)
|
58
186
|
|
187
|
+
サーバとクライアントを同じパソコンの時は
|
188
|
+
|
189
|
+
サーバ:windows(Eclipse、openjdk11)
|
190
|
+
|
191
|
+
クライアント:windows(コマンドプロンプト、openjdk11)
|
192
|
+
|
59
193
|
サーバとクライアントを別のパソコンにしたときは
|
60
194
|
|
61
|
-
サーバ:windows
|
195
|
+
サーバ:windows(Eclipse、openjdk11)
|
62
196
|
|
63
|
-
クライアント:Mac
|
197
|
+
クライアント:Mac(ターミナル、java 14.0.2)
|
64
198
|
|
65
199
|
で、Wifiのローカルネットワークで通信しました。
|