Savoir si un ServerSocket attend sur un .accept() ? [JAVA] - Java - Programmation
Marsh Posté le 22-04-2004 à 20:28:34
tu fait un bind() explicite de ta socket, tu préviens que c'est fixé, avant de faire le accept() :
java/net/ServerSocket.html#bind(java.net.SocketAddress)
(le paramètre peut être nul, auquel cas le système choisi un port à ta place).
Marsh Posté le 22-04-2004 à 23:47:10
j'ai pas tt lu mais pourquoi pas fixé le port 21 pour l'ecoute ?
c'est pas standard ce que t'essaye de faire
Marsh Posté le 23-04-2004 à 00:00:19
Nan je parle pas du ServerSocket principal qui lui bien sur écoute sur le port 21 (ou un autre).
En mode passif, pour les transferts de données, le serveur ouvre un autre port, et dit au client de se connecter à ce port pour receptionner/envoyer les données.
Le truc, c'est qu'avant d'envoyer le numéro de port au client, j'aimerai être sur que le serveur a bien ouvert ce port.
Marsh Posté le 22-04-2004 à 17:04:17
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