Nous sommes actuellement le 14 Juil 2026, 19:40

Le fuseau horaire est UTC-5 heures [Heure d’été]




Publier un nouveau sujet Répondre au sujet  [ 7 message(s) ] 
Auteur Message
MessagePublié: 02 Mars 2004, 10:51 
Hors-ligne
Régulier
Régulier

Inscription : 22 Juin 2003, 00:01
Message(s) : 396
Bonjour à tous, j'ai ici un problème de programmation que je suis pas capable de résoudre. Je suis en train de coder en JAVA un module qui permet de gérer la communication de plusieurs petites interfaces de jeux. Alors dès qu'un jeux est terminé, le ServeurSocket devrait être fermé pour libérer le port pour une réutilisation ultérieure, mais il ne veut absolument rien savoir et me sort l'erreur.

java.net.SocketException: socket closed
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:421)
at java.net.ServerSocket.implAccept(ServerSocket.java:243)


La ligne fautive est désignée par une flèche. En passant, le client n'est plus connecté sur le serveur quand il essait de libérer le port.

Code :

//Constructeur
public Partie(String nomDePartie,int le_Port)
  {
    Partie.nbPartieCree++;

    //initialise le timer à une minute. 1=30 secondes.
    this.tacheTimer = new TacheTimer(1,this);
    //place le nom de la partie dans la variable privée à la classe.
    this.nomPartie = nomDePartie;
    //contient le port qui sera utilisé par la partie.
    this.Port = le_Port;
    try
    {
      //place le port de la partie dans le serverSocket.
      this.gameSocket = new ServerSocket(this.Port);
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
    //active le processus.
    this.start();
  }


public void terminerPartie()
  {
    //creer un objet de type Socket.
    ServerConnectionThread client = null;

    for(int i=0;i<this.maxJoueurAtteint;i++){
      //place le socket du verteur dans la variable clientSocket.
      client = (ServerConnectionThread)this.tabSocket.get(i);
      //ferme le Socket.
      client.stopRunning();
    }
    client = null;

    try{
   
      this.gameSocket.close();  <-------------------------------------------

    }catch (Exception e){
      System.out.println("Le gameSocket close impossible " + this.nomPartie);
    }

  }





Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 02 Mars 2004, 14:25 
Hors-ligne
A réponse à tout!
A réponse à tout!
Avatar de l’utilisateur

Inscription : 14 Mars 2002, 22:24
Message(s) : 3308
Localisation : Québec
C'est bizarre que ce soit la ligne avec une flèche qui te donne une erreur, parce que tu fais un catch de toutes les exceptions et que tu affiche un message personnalisé de toutes les exceptions récupérées.

En plus, le type d'exception laisse penser que l'erreur a eu lieu lors de l'acceptation d'une connection et non lors de sa fermeture.

Comme tu travaille avec des sockets, tu as probablement une couple de threads qui roulent en background? Il faudrait probablement arrêter les threads avant de fermer la connection ou créer des sections critiques et faire une validation dans chaque thread avant d'accepter la connection pour savoir si elle est fermée.

_________________
Linux 2.6.22 debian gcc 4.2
KDE 3.5.7 / xorg-x11 7.3


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 02 Mars 2004, 16:04 
Hors-ligne
Régulier
Régulier

Inscription : 22 Juin 2003, 00:01
Message(s) : 396
euhhh! ya quelque chose que j'avais pas dis, mais je crois que c'est très important que je le mentionne maintenant.

Code :
public class Partie extends Thread implements MessageListener


Comme vous pouvez le voir la classe elle meme est un Thread. Mais comment faire pour le stopper?


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 02 Mars 2004, 16:23 
Hors-ligne
A réponse à tout!
A réponse à tout!
Avatar de l’utilisateur

Inscription : 14 Mars 2002, 22:24
Message(s) : 3308
Localisation : Québec
Tintinabulles a écrit:
euhhh! ya quelque chose que j'avais pas dis, mais je crois que c'est très important que je le mentionne maintenant.

Code :
public class Partie extends Thread implements MessageListener


Comme vous pouvez le voir la classe elle meme est un Thread. Mais comment faire pour le stopper?


Mes seules expériences avec les sockets et les threads datent des MFC, mais le fonctionnement devrait être semblable.

Il doit y avoir une place dans ta classe où tu accepte une connection, du genre : gameSocket.accept();
Normalement, la thread stoppe à cet endroit et attends une connection. Il suffirait probablement de faire un try/catch de l'exception SocketException pour savoir si le socket a été fermé.

_________________
Linux 2.6.22 debian gcc 4.2
KDE 3.5.7 / xorg-x11 7.3


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 02 Mars 2004, 19:35 
Hors-ligne
Régulier
Régulier

Inscription : 22 Juin 2003, 00:01
Message(s) : 396
Oui c'est exactement ça! Merci, maintenant je sais quel est mon problème. Mais même si le ServerSocket se ferme, le port est toujours sur écoute. Je tappe la commande netstat et je vois qu'il n'est pas fermé. En fait il est sur waiting. Le port se ferme seulement quand je ferme toute l'application.

Je vous remercie bcp pour votre aide. Demain matin je vais prendre le temps de tracer mon code pour voir si j'aurais pas oublié un ti qlq chose qlq part.


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 03 Mars 2004, 02:44 
Hors-ligne
A réponse à tout!
A réponse à tout!
Avatar de l’utilisateur

Inscription : 14 Mars 2002, 22:24
Message(s) : 3308
Localisation : Québec
Tintinabulles a écrit:
Oui c'est exactement ça! Merci, maintenant je sais quel est mon problème. Mais même si le ServerSocket se ferme, le port est toujours sur écoute. Je tappe la commande netstat et je vois qu'il n'est pas fermé. En fait il est sur waiting. Le port se ferme seulement quand je ferme toute l'application.

Je vous remercie bcp pour votre aide. Demain matin je vais prendre le temps de tracer mon code pour voir si j'aurais pas oublié un ti qlq chose qlq part.


Il ne faut pas fermer directement l'objet ServerSocket, mais il faut fermet tous les objets Socket créés à l'aide du ServerSocket en premier. Ensuite, tu peux fermer le ServerSocket.

En fermant seulement le ServerSocket, les autres connections existent toujours. Peut-être qu'en appelant le collecteur d'ordures ca ferait la job (System.gc()), mais ca ne serait pas la meilleure solution et ca ne fonctionnerait peut-être pas.

_________________
Linux 2.6.22 debian gcc 4.2
KDE 3.5.7 / xorg-x11 7.3


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 03 Mars 2004, 13:48 
Hors-ligne
Régulier
Régulier

Inscription : 22 Juin 2003, 00:01
Message(s) : 396
Merci bcp, j'ai réussi a régler mon problème!! En gros c'est que dans mon run, j'ai une condition qui faisait que j'ai un accept() qui se faisait. J'avais pas pensé de mettre cette condition la a faux dans ma partie. Une fois cela fait tout allait comme sur des roulettes. Mais c'est vraiment grâce à vous que j'ai allumé!! Merci ben gros!


Haut
 Profil  
Répondre en citant  
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 7 message(s) ] 

Le fuseau horaire est UTC-5 heures [Heure d’été]


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum

Recherche de:
Aller vers :  
cron
Propulsé par phpBB® Forum Software © phpBB Group
Traduction et support en françaisHébergement de site