Socket exception [Fermé]

Signaler
-
Messages postés
16371
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
-
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

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();
		}
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();
		}
	}

}
Messages postés
16371
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 856
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 ?)
Effectivement ça marche quand je retire le input.readObject() dans ClientThread. Mais ducoup j'aimerai une conversation entre client et serveur ? Comment faire ?
Enfaite j'aimerai que le serveur ne se coupe j'amaisn et que dans un premier temp un client se connecter puis plusieur (je retien les client dans le serveur) mais que le serveur réponde automatiquement quand un client envoye un message.
Messages postés
16371
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 856
Le problème c'est que si tu close() un stream, tu close() aussi la socket qu'il y a derrière.

Ci-dessous un exemple complet qui fonctionne :

import java.io.Closeable;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SocketUtil implements AutoCloseable {

    public static String HOST = "localhost";
    public static int PORT = 12455;

    private final String myName, otherName;
    private final Socket socket;

    public SocketUtil(String myName, String otherName, Socket socket) {
        this.myName = myName;
        this.otherName = otherName;
        this.socket = socket;
    }

    private String getDataDescription(Object data) {
        return data == null ? "{null}" : "{" + data.getClass() + " " + data + "}";
    }

    public Object readObject() {
        Logger.getGlobal().info(myName + " initialize input with " + otherName);
        try {
            ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
            Logger.getGlobal().info(myName + " readObject from " + otherName);
            Object data = input.readObject();
            Logger.getGlobal().info(myName + " readObject " + getDataDescription(data) + " from " + otherName);
            return data;
        } catch (Exception e) {
            Logger.getGlobal().log(Level.WARNING, myName + " can't readObject from " + otherName, e);
            return null;
        }
    }

    public void writeObject(Object data) {
        Logger.getGlobal().info(myName + " initialize output with " + otherName);
        try {
            ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
            Logger.getGlobal().info(myName + " writeObject  " + getDataDescription(data) + " to " + otherName);
            output.writeObject(data);
            Logger.getGlobal().info(myName + " writeObject to " + otherName);
        } catch (Exception e) {
            Logger.getGlobal().log(Level.WARNING, myName + " can't writeObject to " + otherName, e);
        }
    }

    @Override
    public void close() throws IOException {
        socket.close();
    }
}

import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

class ServerThread extends Thread {

    private final long id;
    private final Socket clientSocket;

    public ServerThread(long id, Socket clientSocket) {
        this.id = id;
        this.clientSocket = clientSocket;
    }

    @Override
    public void run() {
        try (SocketUtil socketUtil = new SocketUtil("Server", "Client " + id, clientSocket)) {
            Object data = socketUtil.readObject();
            if (data != null) {
                socketUtil.writeObject(data);
            }
        } catch (Exception e) {
            Logger.getGlobal().log(Level.WARNING, "Can't run Client " + id, e);
        }
    }
}

public class Server {
    public static void main(String[] args) throws Exception {
        Logger.getGlobal().info("Server starting");
        try (ServerSocket serverSocket = new ServerSocket(SocketUtil.PORT)) {
            Logger.getGlobal().info("Server is started");
            for (long n = 1;; n++) {
                Logger.getGlobal().info("Server wait client " + n);
                Socket clientSocket = serverSocket.accept();
                Logger.getGlobal().info("Server accept client " + n);
                new ServerThread(n, clientSocket).start();
            }
        } finally {
            Logger.getGlobal().info("Server stopping");
        }
    }
}

import java.net.Socket;
import java.util.logging.Logger;

public class Client {
    public static void main(String[] args) throws Exception {
        Logger.getGlobal().info("Client starting");
        try (Socket serverSocket = new Socket(SocketUtil.HOST, SocketUtil.PORT);
                SocketUtil socketUtil = new SocketUtil("Client", "Server", serverSocket)) {
            Logger.getGlobal().info("Client is connected");
            socketUtil.writeObject("Salut");
            Object data = socketUtil.readObject();
            Logger.getGlobal().info("Client read " + data);
        } finally {
            Logger.getGlobal().info("Client stopping");
        }
    }
}