Socket udp java

Fermé
wiam_ Messages postés 169 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 11 août 2013 - Modifié par wiam_ le 20/12/2010 à 23:20
wiam_ Messages postés 169 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 11 août 2013 - 29 déc. 2010 à 23:35
Bonjour,

Bonsoit tt le monde ,
j'essaye de créer un client serveur udp en java , avec un prog très basique , mais le pb est que ça marche pas . voici mon code :

// coté client

public class ClientTest extends Thread{ 
  
 public void run(){ 
    
  try { 
    
   byte[] tb = "messageTest".getBytes();  
   System.out.println("ici client 1"); 
      DatagramPacket dp = new     DatagramPacket(tb,tb.length,InetAddress.getLocalHost(),5000); 
      DatagramSocket ds = new DatagramSocket(); 
   ds.send(dp); 
   System.out.println("ici client 2"); 
      }catch (IOException ioe){ 
   ioe.printStackTrace(); 
    
 } 
} 
} 

// coté serveur  
public class Serveur extends Thread{ 
   
  public void run(){ 
    
   try { 
    byte[] tb = new byte[100];  
    DatagramSocket ds = new DatagramSocket(900, InetAddress.getLocalHost()); 
    System.out.println("je suis le serveur 0");  
       DatagramPacket dp = new DatagramPacket(tb,tb.length); 
       System.out.println("je suis le serveur 1");  
    ds.receive(dp); 
    System.out.println(new String (dp.getData(),0,dp.getOffset())); 
    System.out.println(" ca vient de :"+dp.getAddress()+":"+ dp.getPort()); 
    ds.close(); 
    System.out.println("je suis le serveur 2");  
         }catch (IOException ioe){ 
    ioe.printStackTrace(); 
          } 
   } 
} 


// et voici mon main  

public static void main(String[] args) { 
   
   ClientTest c = new ClientTest();  

              c.start(); 
      
 } 


le client se contente d'afficher :
ici client 1
ici client 2

et j'ai rien du coté serveur , et quand je lance le serveur , j'ai une erreur de sorte : Address already in use: Cannot bind


Merci bcp pour votre aide
A voir également:

7 réponses

flo13142 Messages postés 71 Date d'inscription mardi 7 décembre 2010 Statut Membre Dernière intervention 21 février 2011 18
21 déc. 2010 à 08:37
Salut,
tu n'aurais pas un serveur des tes anciens essais qui tournerait encore?
L'erreur que tu as correspond au fait que ton port 900 est déjà utilisé.
Ou tu as peut être déjà quelque chose qui utilise ce port.
Pourquoi le client envoie sur le 5000 et le serveur écoute sur le 900? Il faut que ce soit le même port.
0
wiam_ Messages postés 169 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 11 août 2013 8
Modifié par wiam_ le 21/12/2010 à 10:47
merci pour ta réponse,
oui t'as raison j'ai pas utilisé le même numéro de port, avec le même numéro de port il affiche bien le message . Mais parfois quand je lance mon main deux fois de suite , ça marche que la première fois , et la deuxième fois il me dit que l'adresse est déjà utilisée. Est ce que c normal parce que mon port reste toujours utilise.
Et une autre question , dans le main est ce que je suis obligé de lancer le client et le serveur ? il ne suffit pas de lancer que le client ? sinon lequel il faut lancer le premier?

Merci encore
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
21 déc. 2010 à 12:01
Salut,



Je ne connais pas grand chose aux protocoles de communication, mais en lisant ce qui concerne UDP comparativement aux protocoles TCP et FTP, cela me donne l'impression que UDP ne relève pas d'un modèle client-serveur dans lequel un client et un serveur doivent d'abord se mettre d'accord pour établir une connexion.

Le protocole UDP n'est pas orienté connexion, est très simple, il peut servir pour des messages unidirectionnels (voir dossier CCM sur UDP)



Ceci étant, quand tu écris que tu veux « créer un client serveur udp en java » , je trouve bizarre et je me demande si le projet est cohérent au départ.

Mais je ne connais pas plus que ça le sujet.
0
wiam_ Messages postés 169 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 11 août 2013 8
21 déc. 2010 à 12:26
merci de m'avoir répondu ,

c'est justement ce que je veux faire, je veux que mon client envoie des messages en permanent au serveur , qui lit les messages en permanent à son tour aussi, mais ne renvoie rien au client.

tt se passe bien mais au bout d'un moment , j'ai des messages de genre "Address already in use: Cannot bind" , et ça continue après . Je sais pas si c du à un pb de synchronisation entre le serveur et le client ?

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
Modifié par heyquem le 21/12/2010 à 13:49
Je ne connais vraiment pas bien ces sujets.



Mais je viens de lire la page de Sebsauvage consacrée à TCP/IP
http://sebsauvage.net/comprendre/tcpip/
On y comprend bien ce que le protocole TCP fait de plus par rapport à UDP:

TCP est capable:

de faire tout ce que UDP sait faire (ports).
de vérifier que le destinataire est prêt à recevoir les données.
de découper les gros paquets de données en paquets plus petits pour que IP les accepte
de numéroter les paquets, et à la réception de vérifier qu'ils sont tous bien arrivés, de redemander les paquets manquants et de les réassembler avant de les donner aux logiciels. Des accusés de réception sont envoyés pour prévenir l'expéditeur que les données sont bien arrivées.


Comme il le dit bien:

L'avantage de TCP sur UDP est que TCP permet des communications fiables. L'inconvénient est qu'il nécessite une négociation



Donc dans le protocole TCP, il y a négociation, dans UDP il n'y en a pas.

Dans TCP, la communication entre un client et un serveur est une communication synchronisée = une connexion: il y a des échanges de messages entre ordinateurs concernant la façon dont se réalise chaque transfert de données.
Par exemple, en FTP, qui utilise TCP, il y a une réponse FTP sous forme de code à 3 chiffres qui revient systématiquement vers le client après que ce dernier ait envoyé un ordre vers le serveur FTP.

Tandis que dans le protocole UDP, il n'y a pas de vérifications échangées entre les deux ordinateurs communicants pour vérifier l'intégrité des messages transités; quand il reçoit un message, l'ordinateur récepteur ne répond pas systématiquement ( != serveur).

C'est ce que j'ai voulu dire et c'est bien ce que tu décris:
« mon client envoie des messages en permanent au serveur , qui lit les messages en permanent à son tour aussi, mais ne renvoie rien au client. »

Mais c'est "marrant" , tu termines en te demandant quand même:
« Je sais pas si c dû à un pb de synchronisation entre le serveur et le client ? »
C'est là que je trouve que ça manque de cohérence.

À partir de là, je me demande si cette apparente incohérence entre ce que tu vises et ce que fait effectivement le protocole UDP n'est pas source d'une erreur de conception.



Mais je répète, je ne suis pas calé sur ces sujets.
Et en plus je ne connais pas Java.
Et en plus je n'aime pas Java.



PS

TCP is a connection-oriented protocol, which means before a client can send messages with the server, a connection needs to be explicitly created to the server, and only then can the client-server communication take place. On the other hand, UDP is a connectionless protocol, which means no connection needs to be established between the client and the server for communication.
https://evolt.org/node/60276
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
21 déc. 2010 à 14:04
Sur cette page
http://python.jpvweb.com/mesrecettespython/doku.php?id=client-serveur_udp_mini
je lis:

1- Le serveur UDP synchrone

C'est un serveur synchrone, c'est à dire que chaque requête doit attendre la fin du traitement de la requête précédente


Cela conduit à l'idée que ton serveur passe peut être trop vite d'un traitement à un autre, sans laisser le temps au port concerné d'être libéré.
Il faudrait peut être mettre un temporisation.
0
wiam_ Messages postés 169 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 11 août 2013 8
Modifié par wiam_ le 28/12/2010 à 22:44
oui merci

j'ai mis un sleep(10) au niveau du client , et ça marche mieux , mais au bout d'un moment il remet l'erreur . donc , je crois que je dois augmenter le temps de mon sleep.

Merci pour ton aide.
0
wiam_ Messages postés 169 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 11 août 2013 8
28 déc. 2010 à 22:46
Bonsoir tt le monde ,

c'est tjrs moi !!

cette fois ci , j'ai un programme serveur multi clients en udp, chaque clients est reconnu par son identifiant . Le serveur connait à priori les identifiants de ces clients . Je voudrais envoyé une requête pour un client précis en utilisant cet identifiant , comment je fait pour cela ?

Merci bcp pour votre aide !!!



Configuration: Windows Vista / Firefox 3.6
0
wiam_ Messages postés 169 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 11 août 2013 8
29 déc. 2010 à 23:35
je n'ai tjrs pas trouvé une solution , si qql peut me donner une idée ce serait vraiment sympa ,

Merci à vs
0