質問編集履歴

1

エラーの詳細を記述しました。

2020/08/09 21:20

投稿

yukiend
yukiend

スコア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
- ServerSocket ss = new ServerSocket(port)
91
+ import java.io.BufferedReader;
18
92
 
19
- Socket socket = ss.accept();
93
+ import java.io.IOException;
20
94
 
21
- sisr = new InputStreamReader(socket.getInputStream());
95
+ import java.io.InputStreamReader;
22
96
 
23
- br = new BufferedReader(sisr);
97
+ import java.net.ServerSocket;
24
98
 
25
- try{
99
+ import java.net.Socket;
26
100
 
27
- while(true) {// データを受信し続ける
28
101
 
29
- String inputLine;
30
102
 
31
- inputLine = br.readLine();
103
+ public class Servertest {
32
104
 
33
- //inputLineを使った処理
105
+ public static void main(String[] args){
34
106
 
35
- }
107
+ ServerSocket ss;
36
108
 
37
- }
109
+ try {
38
110
 
39
- catch (IOException e){
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
- e.printStackTrace();
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のローカルネットワークで通信しました。