Je programme actuellement un ptit serveur ftp en java, et pour gérer le mode passif, le serveur doit créer une socket en attente de connexion sur un port local, puis transmettre le numéro de ce port au client.
Alors seulement, le client connait le port sur lequel il doit se connecter.
Mon problème étant donc de n'écrire au client qu'une fois que le ServerSocket est bien en attente d'un accept().
Le accept() étant bloquant, je suis obligé de le foutre dans un thread à part, le problème étant de pouvoir savoir exactement à quel moment le serveur se met en attente.
J'ai pas trouvé de méthode serversocket.isWaitingForConnections() ou un truc ds le genre.
J'ai fait un truc de ce style là :
boolean serverStarted = false;
ServerSocket server = new ServerSocket(portDonnees);
t = new Thread() {
public void run() {
try {
System.out.println("Thread démarré" );
serverStarted = true;
socket_donnees = server.accept();
initSocketDonnees();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
};
t.start();
try {
while (serverStarted == false) {
Thread.sleep(10);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
Envoit au client le port sur lequel le serveur est démarré
|
Le truc c'est que forcément c'est assez crade, rien ne me dit que le thread va executer la ligne serverStarted = true, puis refiler la main à mon autre thread qui teste la valeur de serverStarted, avant d'executer la ligne du .accept().
Bien sur, en faisant un Thread.sleep relativement long, ça marche, m'enfin là aussi c'est pas non plus génial comme solution, puisque ça pourrait potentiellement ne pas marcher.
Y a un moyen efficace de tester si le ServerSocket est en attente de connexions ? Désolé si c'est tout con, mais j'ai pas trouvé dans l'API.
Message édité par Threep le 22-04-2004 à 17:04:41