Socket exception

helloworld -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
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

		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

helloworld
 
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();
		}
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Le close est automatique à la fin d'un try-with-resources (c'est d'ailleurs le seul intérêt de cette écriture).

Dans quel ordre tu démarres tes programmes ?
Il faut que le serveur fonctionne avant que les clients se connectent sinon le programme client va planter.
0
helloworld
 
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();
		}
	}
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > helloworld
 
Il faudrait le code complet des deux programmes client et serveur pour reproduire le bug car si je complète moi même je risque de ne pas faire la même erreur...
0
helloworld
 
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();
		}
	}

}
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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 ?)
0