Socket exception
helloworld
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
Bonjour,
J'ai l'exception suivante : java.net.SocketException: Socket closed
Je ne comprend pas pourquoi.. dans mon code je n'ai même pas fermer le socket.
Le server s'execute correcetement et au moment ou je connecte le client l'execption est levé.
Serveur
Client
J'ai l'exception suivante : java.net.SocketException: Socket closed
Je ne comprend pas pourquoi.. dans mon code je n'ai même pas fermer le socket.
Le server s'execute correcetement et au moment ou je connecte le client l'execption est levé.
Serveur
try (ServerSocket serverSocket = new ServerSocket(12341)) {
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("New client connected");
ServerThread thread = new ServerThread(clientSocket); // extends thread
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Client
try (Socket socket = new Socket("localhost", 12341)) {
ClientThread thread = new ClientThread(socket); //extends thread
thread.start();
thread.send("Bonjour");
} catch (IOException e) {
e.printStackTrace();
}
}
Configuration: Windows / Chrome 71.0.3578.98
1 réponse
-
Petite précision l'exception est toujours levé dans mon thread gérant le coté client
public void run() { try { String message = null; if (in.readObject() != null) { //exception ici message = (String) in.readObject(); System.out.println(message); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }-
-
Je démarre le serveur avant le client, par contre quand je mais dans l'envoie du message dans une methode à part
void send(String message)
alors cela fonctionne, je ne comprend pas pourquoi.
C'est comme si la ressource ce fermait avant l'envoye du message dans la méthode run? C'est possible ?
try (Socket socket = new Socket("localhost", 12343)){ ClientThread thread = new ClientThread(socket); //extends thread thread.start(); thread.send("salut"); } catch (IOException e) { e.printStackTrace(); } } -
-
J'ai recommencé mais je tombe sur le même problème c'est à dire une SocketCloseException même sans le try-with-resources.
Voici tout mon code :
Client
public class Client { public static void main(String[] args) { try { Socket socket = new Socket("localhost", 12455); ClientThread thread = new ClientThread(socket); thread.start(); thread.send("Salut"); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
Server
public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(12455); Socket clientSocket = serverSocket.accept(); System.out.println("New connection is made on port " + clientSocket.getLocalPort()); ServerThread thread = new ServerThread(clientSocket); thread.start(); } catch (IOException e) { e.printStackTrace(); } } }
thread coté client qui envoye et recoit les messages
public class ClientThread extends Thread { private ObjectOutputStream output; private ObjectInputStream input; public ClientThread(Socket socket) { try { output = new ObjectOutputStream(socket.getOutputStream()); output.flush(); input = new ObjectInputStream(socket.getInputStream()); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { try { System.out.println("Server : " + input.readObject()); //Exception levé ici } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void send(String message) { try { output.writeObject(message); output.flush(); output.close(); } catch (IOException e) { e.printStackTrace(); } } }
thread coté serveur qui envoye et recoit les messages
public class ServerThread extends Thread { private ObjectOutputStream output; private ObjectInputStream input; public ServerThread(Socket socket) { try { output = new ObjectOutputStream(socket.getOutputStream()); output.flush(); input = new ObjectInputStream(socket.getInputStream()); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { try { System.out.println("Client : " + input.readObject()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void send(String message) { try { output.writeObject(message); output.flush(); output.close(); } catch (IOException e) { e.printStackTrace(); } } } -
Le problème c'est que tu as fait le même code dans le run() de ClientThread et ServerThread, c'est à dire que input.readObject() va attendre que l'autre programme lui envoie une donnée, or quand le serveur a reçu "Salut" il a fini son travail : il n'envoie jamais rien au client (la méthode send() de ServerThread n'est pas utilisée) et s'arrête en coupant le flux du client, qui plante puisque le flux est fermé.
Il faudrait déjà expliquer ce que tu cherches à faire avec ton client et ton serveur, mais pour moi le client envoie un message et le serveur le reçoit (ok), le serveur n'envoie pas de message donc le client ne reçoit rien (ok ?)
-