Si on fait sock=new ServerSocket(port);
on cree une socket sur un port donne, mais si je relance le programme ou
qu'il se plante, le port tcp reste ouvert,
donc j'ai "cannot create socket
En c ou c++, j'utilise une API setsockopt ( ....., SO_REUSEADDR, true );
le bind reutilser le port
ouvert precedement
mais cela ne semble pas s'appliquer dans ce cas, comment fait on en java
quelqu'un sait comment reutiliser le port tcp si il a ete ouvert, si
possible avec un exemple merci
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
zx
Bon, a force de chercher j'ai fini par trouver? c'etait pas trop compliquer, voici ma solution, pour ne pas bloquer sur une socket deja creer par mon programme.
/* sock=new ServerSocket(port); // ancienne methode, ca marche mais si le port est deja ouvert suite a probleme on ne peut plus reutiliser la socket // c'est dommage qu'on ne puisse pas passer des parametres pour reutiliser le port */
ServerSocketChannel sockChannel = ServerSocketChannel.open(); // ouverture d un canal disponible
//sockChannel.configureBlocking(false); // rendre bloquant ou non ?
InetSocketAddress server=new InetSocketAddress( "localhost", port); // recuperer une adrese inet
ServerSocket maSocket = sockChannel.socket(); // on recupere une socket sur le canal
maSocket.setReuseAddress(true); // on demande a reutiliser le port si il est deja ouvert
maSocket.bind(server); // etablissement de lialison et mise en ecoute de ce qui vient sur la socket
System.out.println("Raaaaaaaaaaaaaaaaaaaah ! Glop Glop ! Serveur running "); // en plus ca marche en echange } catch ( IOException e ) { System.out.print("cannot create socket"); System.exit(1); } }
public void run() {
Socket client = null; while (true ) { if ( sock == null ) return ; try { client = sock.accept(); // en attente d une connexion client
BufferedReader plec = new BufferedReader( new InputStreamReader(client.getInputStream())); PrintWriter pred = new PrintWriter( new BufferedWriter( new OutputStreamWriter(client.getOutputStream())), true);
while (true) { // on boucle sur la reception des messages en provenance du client
System.out.println("Attente reception d un msg");
String str = plec.readLine(); // lecture du message en provenance du client
if (str.equals("END")) break; // on a recu le message du client le mot END on arrete la boucle d ecoute,
pred.println(str); // on retourne le message recu au client pred.flush(); // on valide le buffer pour l envoyer maintenant }
client.close(); // on ferme la connexion cliente } catch ( IOException e ) { System.out.println("cannot connect client"); System.exit(1);
} } }
public static void main( String[] arguments ) { Serveur server= new Serveur(); server.start(); } }
Bon, a force de chercher j'ai fini par trouver? c'etait pas trop
compliquer,
voici ma solution, pour ne pas bloquer sur une socket deja creer par mon
programme.
/*
sock=new ServerSocket(port); // ancienne methode, ca marche mais si le
port est deja ouvert suite a probleme on ne peut plus reutiliser la socket
// c'est dommage qu'on
ne puisse pas passer des parametres pour reutiliser le port
*/
ServerSocketChannel sockChannel = ServerSocketChannel.open(); //
ouverture d un canal disponible
//sockChannel.configureBlocking(false); // rendre bloquant ou non ?
InetSocketAddress server=new InetSocketAddress( "localhost", port); //
recuperer une adrese inet
ServerSocket maSocket = sockChannel.socket(); // on recupere une
socket sur le canal
maSocket.setReuseAddress(true); // on demande a reutiliser le port si
il est deja ouvert
maSocket.bind(server); // etablissement de lialison et
mise en ecoute de ce qui vient sur la socket
System.out.println("Raaaaaaaaaaaaaaaaaaaah ! Glop Glop ! Serveur
running "); // en plus ca marche en echange
}
catch ( IOException e ) {
System.out.print("cannot create socket");
System.exit(1);
}
}
public void run() {
Socket client = null;
while (true ) {
if ( sock == null )
return ;
try {
client = sock.accept(); // en attente d une connexion client
BufferedReader plec = new BufferedReader( new
InputStreamReader(client.getInputStream()));
PrintWriter pred = new PrintWriter( new BufferedWriter( new
OutputStreamWriter(client.getOutputStream())), true);
while (true) { // on boucle sur la reception des messages en
provenance du client
System.out.println("Attente reception d un msg");
String str = plec.readLine(); // lecture du message en
provenance du client
if (str.equals("END")) break; // on a recu le message du
client le mot END on arrete la boucle d ecoute,
Bon, a force de chercher j'ai fini par trouver? c'etait pas trop compliquer, voici ma solution, pour ne pas bloquer sur une socket deja creer par mon programme.
/* sock=new ServerSocket(port); // ancienne methode, ca marche mais si le port est deja ouvert suite a probleme on ne peut plus reutiliser la socket // c'est dommage qu'on ne puisse pas passer des parametres pour reutiliser le port */
ServerSocketChannel sockChannel = ServerSocketChannel.open(); // ouverture d un canal disponible
//sockChannel.configureBlocking(false); // rendre bloquant ou non ?
InetSocketAddress server=new InetSocketAddress( "localhost", port); // recuperer une adrese inet
ServerSocket maSocket = sockChannel.socket(); // on recupere une socket sur le canal
maSocket.setReuseAddress(true); // on demande a reutiliser le port si il est deja ouvert
maSocket.bind(server); // etablissement de lialison et mise en ecoute de ce qui vient sur la socket
System.out.println("Raaaaaaaaaaaaaaaaaaaah ! Glop Glop ! Serveur running "); // en plus ca marche en echange } catch ( IOException e ) { System.out.print("cannot create socket"); System.exit(1); } }
public void run() {
Socket client = null; while (true ) { if ( sock == null ) return ; try { client = sock.accept(); // en attente d une connexion client
BufferedReader plec = new BufferedReader( new InputStreamReader(client.getInputStream())); PrintWriter pred = new PrintWriter( new BufferedWriter( new OutputStreamWriter(client.getOutputStream())), true);
while (true) { // on boucle sur la reception des messages en provenance du client
System.out.println("Attente reception d un msg");
String str = plec.readLine(); // lecture du message en provenance du client
if (str.equals("END")) break; // on a recu le message du client le mot END on arrete la boucle d ecoute,
Question, si j'utilise mode bloquant sur une socket, l'option connect ne foncitonne qu'en mode 1 pour 1 ?
c'est a dire 1 connection a la fois, les autres attendent la disponibilite du serveur ?
Mode non bloquant, le serveur doit savoir gerer la collections des cnx des evenenements entrants via un mode selector sur les canaux disponibles
//sockChannel.configureBlocking( .. ); // ex rendre bloquant ou non ?
Si je ne specifie rien, suis je en mode bloquant par defaut ? dans le cas d' un traitement classique de connexion socket TCP
Si quelqu'un peut me repondre a ce sujet
Merci pour vos infos.
cdt
alexandre cartapanis
Bonjour,
j'ai une petite question,
Si on fait sock=new ServerSocket(port); on cree une socket sur un port donne, mais si je relance le programme ou qu'il se plante, le port tcp reste ouvert, donc j'ai "cannot create socket
En c ou c++, j'utilise une API setsockopt ( ....., SO_REUSEADDR, true ); le bind reutilser le port ouvert precedement
mais cela ne semble pas s'appliquer dans ce cas, comment fait on en java
quelqu'un sait comment reutiliser le port tcp si il a ete ouvert, si possible avec un exemple merci
Merci pour vos infos
cdt
ServerSocket server = new ServerSocket(); ... server.setReuseAddress(true); ...
Voila, je crois que cela reponds a ta question :)
Bonjour,
j'ai une petite question,
Si on fait sock=new ServerSocket(port);
on cree une socket sur un port donne, mais si je relance le programme ou
qu'il se plante, le port tcp reste ouvert,
donc j'ai "cannot create socket
En c ou c++, j'utilise une API setsockopt ( ....., SO_REUSEADDR, true );
le bind reutilser le port
ouvert precedement
mais cela ne semble pas s'appliquer dans ce cas, comment fait on en java
quelqu'un sait comment reutiliser le port tcp si il a ete ouvert, si
possible avec un exemple merci
Merci pour vos infos
cdt
ServerSocket server = new ServerSocket();
...
server.setReuseAddress(true);
...
Si on fait sock=new ServerSocket(port); on cree une socket sur un port donne, mais si je relance le programme ou qu'il se plante, le port tcp reste ouvert, donc j'ai "cannot create socket
En c ou c++, j'utilise une API setsockopt ( ....., SO_REUSEADDR, true ); le bind reutilser le port ouvert precedement
mais cela ne semble pas s'appliquer dans ce cas, comment fait on en java
quelqu'un sait comment reutiliser le port tcp si il a ete ouvert, si possible avec un exemple merci
Merci pour vos infos
cdt
ServerSocket server = new ServerSocket(); ... server.setReuseAddress(true); ...