Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Communication UDP

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

9 réponses

Avatar
Bruno Tignac
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

Avatar
Stephane
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/

Avatar
Stéphane
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

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


Avatar
Stéphane
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

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

Avatar
Sebastien
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
Avatar
Stéphane
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

Avatar
Bernard Koninckx
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" a écrit dans le message de news:
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