Communication UDP

Le
Stéphane
Bonjour,

J'essaye d'établir une communication UDP entre un client et un serveur.

Le problème, c'est que tout fonctionne bien pour le premier envoi, mais
impossible d'envoyer d'autres données si celles-ci ne sont pas envoyées
dans une boucle (voir code ci-dessous).

Voici la classe du client:
// -
public class clientDiscardUDP {

public static void main(String[] args) {

try {
InetAddress serveur = InetAddress.getByName("localhost");

BufferedReader saisieUtilisateur = new BufferedReader(
new InputStreamReader(System.in));
DatagramSocket leSocket = new DatagramSocket();

//while (true) {
String laLigne = saisieUtilisateur.readLine();
byte[] donnees = laLigne.getBytes();
DatagramPacket laSortie = new DatagramPacket(donnees,
donnees.length, serveur, 9);
leSocket.send(laSortie);
//}
} catch (Throwable e) {
System.err.println(e);
}
}
}
// -

Le serveur est tout ce qui a de plus classique. J'ai testé avec
différents codes de serveurs UDP et le résultat est le même.

J'arrive bien à voir le premier texte saisi mais si je relance le
client, le second texte n'est pas envoyé. Par contre, il y a bien
quelque chose qui arrive au serveur mais c'est un message de 0 octet :-(

J'utilise une JRE 1.4.2_04 de Sun.

Une suggestion ?

Merci
Stéphane
  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
Bruno Tignac
Le #708580
Stéphane wrote:

Bonjour,

J'essaye d'établir une communication UDP entre un client et un serveur.

Le problème, c'est que tout fonctionne bien pour le premier envoi, mais
impossible d'envoyer d'autres données si celles-ci ne sont pas envoyées
dans une boucle (voir code ci-dessous).

Voici la classe du client:
// -------------------------------------------------------------
public class clientDiscardUDP {

public static void main(String[] args) {

try {
InetAddress serveur = InetAddress.getByName("localhost");

BufferedReader saisieUtilisateur = new BufferedReader(
new InputStreamReader(System.in));
DatagramSocket leSocket = new DatagramSocket();

//while (true) {
String laLigne = saisieUtilisateur.readLine();
byte[] donnees = laLigne.getBytes();
DatagramPacket laSortie = new DatagramPacket(donnees,
donnees.length, serveur, 9);
leSocket.send(laSortie);
//}
} catch (Throwable e) {
System.err.println(e);
}
}
}
// -------------------------------------------------------------

Le serveur est tout ce qui a de plus classique. J'ai testé avec
différents codes de serveurs UDP et le résultat est le même.

J'arrive bien à voir le premier texte saisi mais si je relance le
client, le second texte n'est pas envoyé. Par contre, il y a bien
quelque chose qui arrive au serveur mais c'est un message de 0 octet :-(

J'utilise une JRE 1.4.2_04 de Sun.

Une suggestion ?

Merci
Stéphane


essaie en mettant la creation de la socket dans le while

Stephane
Le #708375
Bonjour,

essaie en mettant la creation de la socket dans le while


Comme je l'avais indiqué, tout fonctionne bien si je mets une boucle while mais
ce que je veux, c'est justement ne faire qu'un envoi (donc pas de boucle while)
puis sortir du programme client.

Mais dans mon cas, si je relance un tel client sans relancer le serveur, le
serveur ne reçoit qu'un message de 0 octets. Avec les tests que j'ai pu faire,
le problème vient du client mais je n'arrive pas à voir ou...

Merci.

Stéphane

--
Utilisez notre serveur de news 'news.foorum.com' depuis n'importe ou.
Plus d'info sur : http://nnrpinfo.go.foorum.fr/

Stéphane
Le #707947
Bonjour,

essaie en mettant la creation de la socket dans le while


Comme je l'avais indiqué, tout fonctionne bien si je mets une boucle
while mais ce que je veux, c'est justement ne faire qu'un envoi (donc
pas de boucle while) puis sortir du programme client.

Mais dans mon cas, si je relance un tel client sans relancer le serveur,
le serveur ne reçoit qu'un message de 0 octets. Avec les tests que j'ai
pu faire, le problème vient du client mais je n'arrive pas à voir ou...

Merci.

Stéphane

TestMan
Le #707734
Essayes :

public class clientDiscardUDP {

public static void main(String[] args) {

try {
InetAddress serveur = InetAddress.getByName("localhost");
BufferedReader saisieUtilisateur = new BufferedReader(
new InputStreamReader(System.in));
DatagramSocket leSocket = new DatagramSocket(serveur, 9);

//while (true) {
String laLigne = saisieUtilisateur.readLine();
byte[] donnees = laLigne.getBytes();
DatagramPacket laSortie = new DatagramPacket(donnees,
donnees.length);
leSocket.send(laSortie);
//}
} catch (Throwable e) {
System.err.println(e);
}
}
}

Logiquement ça marchera...celà vient tout simplement du fait que comme
le dit la javadoc pour le constructeur sans paramètre :

"Constructs a datagram socket and binds it to any available port on the
local host machine. The socket will be bound to the wildcard address,
an IP address chosen by the kernel."

En clair, le socket etant lié sur un port aléatoire, il en a rien à
faire plus tard que tu lui assigne un port de destination car il est
déjà lié. Et le packet envoyé le sera vers un point ou il n'y a pas
forcement le bon serveur ...

Merci à la Javadoc ;)

A+
TM

Stéphane wrote:
Bonjour,

J'essaye d'établir une communication UDP entre un client et un serveur.

Le problème, c'est que tout fonctionne bien pour le premier envoi, mais
impossible d'envoyer d'autres données si celles-ci ne sont pas envoyées
dans une boucle (voir code ci-dessous).

Voici la classe du client:
// -------------------------------------------------------------
public class clientDiscardUDP {

public static void main(String[] args) {

try {
InetAddress serveur = InetAddress.getByName("localhost");
BufferedReader saisieUtilisateur = new BufferedReader(
new InputStreamReader(System.in));
DatagramSocket leSocket = new DatagramSocket();

//while (true) {
String laLigne = saisieUtilisateur.readLine();
byte[] donnees = laLigne.getBytes();
DatagramPacket laSortie = new DatagramPacket(donnees,
donnees.length, serveur, 9);
leSocket.send(laSortie);
//}
} catch (Throwable e) {
System.err.println(e);
}
}
}
// -------------------------------------------------------------

Le serveur est tout ce qui a de plus classique. J'ai testé avec
différents codes de serveurs UDP et le résultat est le même.

J'arrive bien à voir le premier texte saisi mais si je relance le
client, le second texte n'est pas envoyé. Par contre, il y a bien
quelque chose qui arrive au serveur mais c'est un message de 0 octet :-(

J'utilise une JRE 1.4.2_04 de Sun.

Une suggestion ?

Merci
Stéphane


Stéphane
Le #707729
TestMan wrote:
Essayes :

...

Logiquement ça marchera...celà vient tout simplement du fait que comme
le dit la javadoc pour le constructeur sans paramètre :



Lors de la création du DatagramSocket j'ai inversé le serveur et le port
car le constructeur que vous vouliez utiliser n'existe pas.

Cela ne fonctionne pas: "java.net.BindException: Address already in use:
Cannot bind".

La machine n'est pas capable d'avoir un serveur sur la socket
localhost:9 et un client avec la socket localhost:9. Cela me semble normal.

Stéphane

Sebastien
Le #707522
TestMan wrote:
Essayes :

public class clientDiscardUDP {

public static void main(String[] args) {

try {
InetAddress serveur = InetAddress.getByName("localhost");
BufferedReader saisieUtilisateur = new BufferedReader(
new InputStreamReader(System.in));
DatagramSocket leSocket = new DatagramSocket(serveur, 9);

//while (true) {
String laLigne = saisieUtilisateur.readLine();
byte[] donnees = laLigne.getBytes();
DatagramPacket laSortie = new DatagramPacket(donnees,
donnees.length);
leSocket.send(laSortie);
//}
} catch (Throwable e) {
System.err.println(e);
}
}
}

Logiquement ça marchera...celà vient tout simplement du fait que comme
le dit la javadoc pour le constructeur sans paramètre :

"Constructs a datagram socket and binds it to any available port on the
local host machine. The socket will be bound to the wildcard address,
an IP address chosen by the kernel."

En clair, le socket etant lié sur un port aléatoire, il en a rien à
faire plus tard que tu lui assigne un port de destination car il est
déjà lié. Et le packet envoyé le sera vers un point ou il n'y a pas
forcement le bon serveur ...

Merci à la Javadoc ;)



Attention, tu confonds le port d'écoute de la socket et le port de destination du paquet.
Je peux très bien créer une socket écoutant sur le port 12 et envoyer un paquet grâce à cette socket
sur le port 345 d'une machine distante.
En clair, pour un client UDP, le constructeur de socket vide convient très bien.

Sébastien

Sebastien
Le #707521
ton code semble correct...
En plus, il n'y a aucune raison pour que le client n'envoie pas le paquet la seconde fois que tu
l'éxécutes...
pourrais-tu envoyer le code du serveur ?

Sébastien
Stéphane
Le #707360
Sebastien wrote:

Bonjour,

ton code semble correct...
En plus, il n'y a aucune raison pour que le client n'envoie pas le
paquet la seconde fois que tu l'éxécutes...
pourrais-tu envoyer le code du serveur ?



J'ai trouvé semble-t-il le problème: j'ai le firewall logiciel Zone
Alarm. Je ne sais pour quelle raison, il filtre mal les trames UDP. Il
prend peut-être mes tests pour une "attaque" ?

Toujours est-il qu'en le désactivant le client fonctionne enfin
parfaitement.

Merci pour vos contributions.

Stéphane

Bernard Koninckx
Le #707359
Salut,

Rien à voir avec le sujet (quoi que ...). J'ai déjà entendu d'anciens
collègues qui se retrouvaient le soir pour jouer à Quake III Arena et QIII
Team Arena qui se sont retrouvés avec des problèmes réseaux quand le serveur
ét it lancé à partir d'une machine qui tournait sous Zone Alarm. Le
passage à la suit de Norton à corrigé le problème. Visiblement comme tu le
dis Zone Alarm, prend certains paquets d'infos comme de attaques alors qu'il
ne devraint pas, même si les ports sont disponibles.

Le choix d'un autre FireWall est peut-être d'application, dans ton cas.

Bernard


"Stéphane" ce8qn4$2din$
Sebastien wrote:

Bonjour,

ton code semble correct...
En plus, il n'y a aucune raison pour que le client n'envoie pas le
paquet la seconde fois que tu l'éxécutes...
pourrais-tu envoyer le code du serveur ?



J'ai trouvé semble-t-il le problème: j'ai le firewall logiciel Zone
Alarm. Je ne sais pour quelle raison, il filtre mal les trames UDP. Il
prend peut-être mes tests pour une "attaque" ?

Toujours est-il qu'en le désactivant le client fonctionne enfin
parfaitement.

Merci pour vos contributions.

Stéphane



Poster une réponse
Anonyme