Bạn nên kiểm tra dấu vết đầy đủ rất cẩn thận,
Tôi có một ứng dụng ổ cắm máy chủ và sửa một java.net.SocketException: Connection reset
trường hợp.
Trong trường hợp của tôi, nó xảy ra trong khi đọc từ một Socket
đối tượng clientSocket bị đóng kết nối vì một số lý do. (Mạng bị mất, tường lửa hoặc sự cố ứng dụng hoặc dự định đóng)
Trên thực tế, tôi đã thiết lập lại kết nối khi tôi gặp lỗi trong khi đọc từ đối tượng Socket này.
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
Điều thú vị là for my JAVA Socket
nếu một khách hàng kết nối với tôi ServerSocket
và đóng kết nối của nó mà không gửi bất kỳ is.read()
cuộc gọi nào theo cách đệ quy. Có vẻ như là trong một vòng lặp vô hạn để đọc từ ổ cắm này, bạn cố gắng đọc từ một kết nối đóng. Nếu bạn sử dụng một cái gì đó như dưới đây cho hoạt động đọc;
while(true)
{
Receive();
}
Sau đó, bạn nhận được một stackTrace một cái gì đó như bên dưới và trên
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
Những gì tôi đã làm chỉ là đóng ServerSocket và gia hạn kết nối của tôi và chờ kết nối máy khách tiếp theo
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit(); //etc
}
//...
}
Điều này xác nhận lại kết nối của tôi cho ổ cắm máy khách không xác định bị mất
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...
}
}
Tôi không thể tìm thấy một cách khác bởi vì khi bạn nhìn thấy từ hình ảnh bên dưới, bạn không thể hiểu liệu kết nối có bị mất hay không mà không có try and catch
, bởi vì mọi thứ dường như đúng. Tôi đã có được ảnh chụp này trong khi tôi đang nhận được Connection reset
liên tục.