Partage
  • Partager sur Facebook
  • Partager sur Twitter

[JAVA] client Serveur TCP/IP

Sujet résolu
4 mai 2013 à 18:28:51

Bonjour

J'ai un programme client serveur, le serveur peut accepter plusieurs connexions clients à la fois.

Le problème ce que quand je ferme mon client  cela ferme mon serveur

Extrait du partie Client

public class Client {

	/**
	 * Methode principale.
	 * 
	 * @param args
	 *            les parametres (IP serveur, port serveur)
	 */
	public static ObjectOutputStream oos;
	public static ObjectInputStream ois;

	public static void main(String[] args) {
		// Verification des parametres
		if (args.length != 2) {
			System.err.println("Usage : java Client IP port");
			System.err.println("  - IP : IP du serveur");
			System.err.println("  - port : numero de port du serveur");
			System.exit(-1);
		}

		// Creation du socket
		Socket socket = null;
		try {
			socket = new Socket(args[0], Integer.parseInt(args[1]));
		} catch (Exception e) {
			System.err.println("Creation socket impossible, Merci de démarrer le serveur");
			System.exit(-1);
		}

		// Association d'un flux d'entree et de sortie
		try {
			oos = new ObjectOutputStream(socket.getOutputStream());
			ois = new ObjectInputStream(socket.getInputStream());
		} catch (Exception e) {
			System.err.println("Association des flux impossible");
			System.exit(-1);
		}

		// Boucle principale

		int choix = -1;
		while (choix != 0) {
			// Affichage du menu et attente de l'ordre
			System.out.println("Votre choix : ");
			System.out.println("  1) test 1");
			System.out.println("  2) test 2");
			System.out.println("  0) quitter");
			System.out.print("    >");
			choix = lireEntier();
			switch (choix) {
			case 1:
				test1(ois, oos);
				break;
			case 2:
				test2(ois, oos);
				break;
			}
		}
		System.out.println("\nAu revoir...");
		// Fermeture des flux et du socket
		try {
			ois.close();
			//l’exécution de la ligne ci-dessous ferme le serveur a corriger
			oos.close();
			System.out.println("socket close");
			socket.close();
		} catch (Exception e) {
			System.err.println("Erreur lors de la fermeture des flux et du socket");
			System.exit(-1);
		}
	}

Extrait de la partie serveur

public class Serveur {
 
    /**
     * Methode principale.
     * @param args      les parametres (le numero de port d'ecoute)
     */
    public static void main(String[] args) {
        // Verification des parametres
        if (args.length != 1) {
            System.err.println("Usage : java Serveur port");
            System.err.println("  - port : numero de port du serveur");
            System.exit(-1);
        }
        int numeroPort = Integer.parseInt(args[0]);
 
        // Creation du socket serveur tcp pour communiquer avec les clients
        ServerSocket socketServeur = null;
        try {
            socketServeur = new ServerSocket(numeroPort);
        } catch (Exception e) {
            System.err.println("Creation socket impossible");
            System.exit(-1);
        }
 
        // Attente d'une connexion d'un client
        try {
            while (true) {
                System.out.println("Attente de connexion...");
                Socket socket = socketServeur.accept();
                TraitementClient t = new TraitementClient(socket);
                t.start();
                System.out.println("Une connexion etablie");
            }
        } catch (Exception e) {
            System.err.println("Erreur lors de l'attente d'une connexion");
            System.exit(-1);
        }
 
        // Fermeture du socket
        try {
            socketServeur.close();
        } catch (Exception e) {
            System.err.println("Erreur lors de la fermeture du socket");
            System.exit(-1);
        }
    }
}



class TraitementClient extends Thread {
 
    private Socket socket;
    private ObjectOutputStream oos = null;
    private ObjectInputStream ois = null;
    private static ArrayList<Integer> listeDistributeurs = new ArrayList<Integer>();
 
    /**
     * Constructeur par initialisation
     * 
     * @param socket
     *            le socket de communication avec le client
     */
    public TraitementClient(Socket socket) {
        this.socket = socket;
        try {
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());
        } catch (Exception e) {
            System.err.println("Association des flux impossible");
            System.exit(-1);
        }
    }
 
    /**}
     * Methode d'execution du thread
     */
    public void run() {
 
        boolean stop = false;
        String message = "";
        // Boucle pour recevoir les ordres
        while (!stop) {
            // Lecture de l'ordre
            System.out.println("Debug Attente de lecture initial");
            try {
                message = (String) ois.readObject();
                System.out.println(message);
            } catch (ClassNotFoundException e) {
                System.out.println("Progoramming Error");
            } catch (IOException e) {
                System.out.println("Server ShutDown");
                System.exit(-1);
            }
            System.out.println("Message recu du client: " + message);
            String[] messageSepare = message.split(";");
            

..........................
Partie supprimé
.........................

                }
            } else
                stop = true;
        }
        // Fermeture des flux et du socket
        try {
        System.out.println("Debug Fermuture socket serveur avec le client");
            ois.close();
            oos.close();
            socket.close();
        } catch (Exception e) {
            System.err.println("Erreur lors de la fermeture des flux et du socket");
            System.exit(-1);
        }
 
        System.out.println("Thread termine");
    }


-
Edité par yann_b 4 mai 2013 à 18:33:22

  • Partager sur Facebook
  • Partager sur Twitter
4 mai 2013 à 19:36:13

Avec des System.exit() dans le traitement d'un client, tu t'attends à quoi ?

La gestion des d'exception ne doit pas être considéré comme des erreur fatale ! Une exception a lieu lors d'une déconnexion. C'est le flux de lecture qui remonte sa déconnexion.

Par ailleurs, System.exit() ne devrait jamais être utilisé. Donc retires tous les appels du serveur.

Pour ce qui est du constructeur de TraitementClient, il ne faut pas la gérer, mais la laisser "remonter" avec throws de façon à ce qu'elle soit gérée par Serveur. Le mieux étant de mettre un ty / catch dans la boucle qui accètes les clients

while( run ) {

    try {
        Socket socket = socketServeur.accept()
        TraitementClient tc = new TraitementClient(socket);
        tc.start();
    } catch(IOException e) {
    }

}



-
Edité par Sebajuste 4 mai 2013 à 19:38:56

  • Partager sur Facebook
  • Partager sur Twitter
4 mai 2013 à 20:06:26

Merci pour la réponse

j'ai modifier mon programme, par contre est ce normal que le serveur reçoive encore des flux alors que j'ai fermé le client ?

int correct =1;
		do {
			try {
			message = (String)ois.readObject();
			ois.reset();				
				System.out.println(message);
				correct=0;
				System.out.println(correct);
			} catch (ClassNotFoundException e) {
				System.out.println("Progoramming Error");
			} catch (IOException e) {
				System.out.println("Server ShutDown");
				//System.exit(-1);
			}
			}while(correct == 1);
			System.out.println("Message recu du client: " + message);


j'ai en permanance "Server ShutDown"

PS: Les System.out.println  sont la pour tests

il faudrait que je ferme le threads

-
Edité par yann_b 4 mai 2013 à 21:36:30

  • Partager sur Facebook
  • Partager sur Twitter
4 mai 2013 à 21:56:39

j'ai trouvé

en remplaçant

  System.out.println("Server ShutDown");
           System.exit(-1);

par

System.out.println("Server ShutDown");
Thread.currentThread().interrupt();
break;

cela fonctionne

-
Edité par yann_b 4 mai 2013 à 21:57:54

  • Partager sur Facebook
  • Partager sur Twitter
4 mai 2013 à 23:05:06

C'est plutôt "correct = 0;" qui est mal placé.

Cette instruction va te faire sortir de la boucle (et le thread va mourir de lui même). Il faut donc placer l'arret l'instruction dans le catch(IOException e)

Par ailleures, après le "} while( correct );"  il faut fermer le socket.  "socket.close();"

  • Partager sur Facebook
  • Partager sur Twitter
11 mai 2024 à 22:35:59

Bonjour, je des difficultés de pouvoir fermer le client quelqu'un peut t'il m'aider s'il vous plaît 🙏🏾

  • Partager sur Facebook
  • Partager sur Twitter
12 mai 2024 à 1:06:07

@WeunoAno Bonsoir, merci de ne pas squatter le sujet d'un autre et de ne pas déterrer d'ancien sujet. Créer votre propre sujet en nous fournissant le code que vous avez écrit en utilisant le bouton code </> de la barre d'outil du forum.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Liens conseillés

Je ferme ici.

  • Partager sur Facebook
  • Partager sur Twitter