java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(...)
at Server.receive(Server.java:34)
原始碼:
writer.write("我是");
writer.newLine();
writer.flush();
// 缺少 writer.close(); socket.close();
導致伺服端 readLine() 讀到流末尾(EOF)前,客戶端進程結束,作業系統發送 RST 封包強制斷開,伺服端拋出 Connection reset。
原始碼:
while ((str = reader.readLine()).length() > 0) { ... }
readLine() 遇到流關閉返回 null,而非空字串。呼叫 null.length() 拋出 NullPointerException,導致執行緒異常終止,Socket 未正常關閉,進一步加劇連線重置。
public class Client {
public static void main(String[] args) throws IOException {
try (Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {
writer.write("我是");
writer.newLine();
writer.flush();
} // try-with-resources 自動關閉 writer & socket
}
}
private void receive() {
try (Socket socket = server.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
StringBuilder msg = new StringBuilder();
String str;
while ((str = reader.readLine()) != null) { // 正確判斷 null
msg.append(str).append("\r\n");
}
System.out.println(msg.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
(line = reader.readLine()) != null。Content-Length 或 Connection: close,瀏覽器會正確關閉連線。