Вам следует очень внимательно изучить всю трассировку,
У меня есть приложение для серверного сокета, и я исправил 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
если клиент подключается к my ServerSocket
и закрывает свое соединение без отправки чего-либо, is.read()
вызывает себя рекурсивно. Похоже, что из-за того, что вы находитесь в бесконечном цикле while для чтения из этого сокета, вы пытаетесь читать из закрытого соединения. Если вы используете что-то подобное ниже для операции чтения;
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
непрерывно.