2016-07-01 1 views
1

J'écris une application serveur/client pour l'école.Qu'est-ce qui cause java.net.SocketException: La connexion est-elle réinitialisée après la fermeture du client?

Chaque fois que je ferme le client, le serveur java 'java.net.SocketException: Connection reset'. Je pense, je dois fermer le socket dans le client avant de fermer la fenêtre JavaFX, mais où? Ou que penses-tu?

J'ai vu une question similaire, mais je ne sais pas comment l'implémenter correctement dans mon programme.

Exception:

20:05:27.132 [Thread-2] ERROR OnlineBank - java.net.BindException: Address already in use: JVM_Bind 
19:51:06.580 [Thread-1] ERROR ServerHandler - java.net.SocketException: Connection reset 
19:51:06.580 [Thread-2] ERROR ServerHandler - java.net.SocketException: Connection reset 

MyProgramm:

private MyProgramm() {  
    server = new MyServer(Constants.REMOTE_PORT); 
    try 
     server.start(); 
    } catch (ClassNotFoundException | IOException e) { 
     logger.error(e);  
    } 
} 

MyServer:

public void start() throws ClassNotFoundException, IOException { 
     try { 
      serverSocket = new ServerSocket(this.port); 

      while (true) { 
       Socket client = serverSocket.accept(); 
       logger.debug(getClass().getName() + " accepts"); 

       Thread threadHandler = new Thread(new ServerHandler(client)); 
       threadHandler.start(); 
      } 

     } finally { 
      if (serverSocket != null) { 
       serverSocket.close(); 
      } 
     } 

    } 

ServerHandler:

@Override 
    public void run() { 

     try (InputStream in = clientSocket.getInputStream(); 
       OutputStream out = clientSocket.getOutputStream(); 
       ObjectInputStream oin = new ObjectInputStream(in); 
       ObjectOutputStream oos = new ObjectOutputStream(out)) { 

      while (true) { 
       try { 
        Object receivedObject = oin.readObject(); 
        handleReceivedObject(oos, receivedObject); 

       } catch (ClassNotFoundException e) { 
        logger.error(e); 
        break; 
       } 
      } 
     } catch (IOException e) { 
      logger.error(e); 
     } 
    } 

MainClient:

public class MainClient extends Application { 
    private static Client client; 

    public static void main(String[] args) { 
     launch(args); 
     try { 
      client = new Client(); 
     } catch (IOException e) { 
      logger.error(e); 
     } 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("/welcome.fxml")); 
     Scene scene = new Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    @Override 
    public void stop() throws Exception { 
     super.stop(); 

     // to avoid NullPointerException 
     if (Client != null && Client.getSocket() != null) { 
      Client.getSocket().close(); 
     } 
    } 
} 

Client:

public class Client { 

    private Socket socket; 
    public Client(String remoteHost, int port) throws UnknownHostException, IOException { 
     if (getSocket() == null) { 
      socket = new Socket(remoteHost, port); 
     } 
    } 

    public Client() throws UnknownHostException, IOException { 
     this(Constants.REMOTE_HOST, Constants.REMOTE_PORT); 
    } 

    public Socket getSocket() { 
     return socket; 
    } 
} 
+1

@ControlAltDel Copie incorrecte. 'SocketException: Socket closed' n'est pas la même chose que' SocketException: connection reset'. Rouvert. – EJP

Répondre

1

Vous avez raison. Vous devez fermer le socket client correctement avant de quitter le client. Sinon, le système d'exploitation peut réinitialiser la connexion au lieu de la fermer. N'étant pas un gars Android je ne peux pas vous conseiller où cette fermeture devrait être placée.

Votre serveur a également un problème. Il doit attraper EOFException dans la boucle de lecture et casser silencieusement. Actuellement, vous ne gérez pas correctement la fin du flux: vous allez l'attraper via catch (EOFException) et l'enregistrer comme une erreur, ce qui n'est pas vraiment le cas.