คุณควรตรวจสอบร่องรอยทั้งหมดอย่างระมัดระวัง
ฉันมีแอปพลิเคชันซ็อกเก็ตเซิร์ฟเวอร์และแก้ไขjava.net.SocketException: Connection reset
กรณี
ในกรณีของฉันมันเกิดขึ้นขณะอ่านจากSocket
อ็อบเจ็กต์clientSocket ซึ่งปิดการเชื่อมต่อเนื่องจากเหตุผลบางประการ (เครือข่ายสูญหายไฟร์วอลล์หรือแอปพลิเคชันขัดข้องหรือตั้งใจปิด)
อันที่จริงฉันกำลังสร้างการเชื่อมต่อใหม่เมื่อฉันได้รับข้อผิดพลาดขณะอ่านจากวัตถุ Socket นี้
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
สิ่งที่น่าสนใจคือfor my JAVA Socket
ถ้าไคลเอนต์เชื่อมต่อกับฉันServerSocket
และปิดการเชื่อมต่อโดยไม่ต้องส่งอะไรis.read()
เรียกตัวเองซ้ำดูเหมือนว่าเป็นเพราะอยู่ในช่วงที่ไม่มีที่สิ้นสุดในขณะที่วนลูปสำหรับการอ่านจากซ็อกเก็ตนี้คุณพยายามอ่านจากการเชื่อมต่อแบบปิด หากคุณใช้สิ่งที่ต้องการด้านล่างสำหรับการอ่าน
while(true)
{
Receive();
}
จากนั้นคุณจะได้รับ stackTrace บางอย่างเช่นด้านล่างและบน
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
สิ่งที่ฉันทำก็แค่ปิด ServerSocket และต่ออายุการเชื่อมต่อและรอการเชื่อมต่อไคลเอนต์ขาเข้าเพิ่มเติม
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit(); //etc
}
//...
}
สิ่งนี้สร้างการเชื่อมต่อของฉันใหม่สำหรับซ็อกเก็ตไคลเอนต์ที่ไม่รู้จักหายไป
private void tryReConnect()
{
try
{
ServerSocket.close();
//empty my old lost connection and let it get by garbage col. immediately
clientSocket=null;
System.gc();
//Wait a new client Socket connection and address this to my local variable
clientSocket= ServerSocket.accept(); // Waiting for another Connection
System.out.println("Connection established...");
}catch (Exception e) {
String message="ReConnect not successful "+e.getMessage();
logit();//etc...
}
}
ฉันหาวิธีอื่นไม่ได้เพราะอย่างที่คุณเห็นจากภาพด้านล่างคุณไม่สามารถเข้าใจได้ว่าการเชื่อมต่อขาดหายหรือไม่หากไม่มี A try and catch
เพราะทุกอย่างดูเหมือนจะถูกต้อง ฉันได้สแนปชอตนี้ในขณะที่ฉันได้รับConnection reset
อย่างต่อเนื่อง