OVH Cloud OVH Cloud

reutilisation d un port tcp

3 réponses
Avatar
zx
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

3 réponses

Avatar
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.

Si ca interesse quelqu'un

import java.io.*;
import java.net.*;
import java.util.*;
import java.nio.channels.*;

public class Serveur extends Thread
{

private ServerSocket sock;

private Serveur()
{
super();
try {

int portE01;

/*
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,

System.out.println("ECHO = " + str); // trace locale

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();
}
}
Avatar
zx
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
Avatar
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 :)