IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Comment envoyer un grand tableau avec socket UDP


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 12
    Points
    12
    Par défaut Comment envoyer un grand tableau avec socket UDP
    Bonjour,
    je me demande comment on peut envoyer un tableau de byte (sa taille est de l'ordre de 350000) par socket UDP en java d'un seul coup.
    ma solution était la suivante:j'ai découpé mon tableau en petit tableau de taille(1024 ou 512) je l'envoi l'un aprés l'autre aprés avoir envoyé la taille de tableau initial ou le nombre de packets à envoyer.

    ma question est: est ce qu'il y'a une autre solution autre que la mienne pour envoyer un tableau de grande taille par socket UDP en java?

    mon probleme c'est le traitement des tableaux qui consomme beaucoup de calcul CPU et de la memoire, donc je dois les optimiser.
    Merci

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par jhon_milou
    mon probleme c'est le traitement des tableaux qui consomme beaucoup de calcul CPU et de la memoire, donc je dois les optimiser.
    On pourrait voir ton code ???

    a++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    voici mon code au niveau de la reception:donc ici je reçois chaque packet, en extraire le tableau et l'ajouter au tableau final.
    voici la methode


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
      public byte[] RecevoirTabUDP(int taille_tab_final)
    		{	
    			int size_max_packet=1024;
    			byte[] tab_src=new byte[taille_tab_final];
    			byte[] tableauPacket=new byte[taille_tab_final];
    			int nbr_packet=(int)(taille_tab_final/size_max_packet);
    			int taille_tab_reste=taille_tab_final-size_max_packet*nbr_packet;
    			DatagramPacket packetUDP;
     
    			try
    			{			
    				//socketSrvUDP.setSoTimeout(5000);
    				for(int i=0;i<nbr_packet;i++)
    				{			
    				        packetUDP = new DatagramPacket(tableauPacket, tableauPacket.length);
    					socketSrvUDP.receive(packetUDP);
    					for(int j=0;j<size_max_packet;j++)
    					{
    				          tab_src[i*size_max_packet+j]=tableauPacket[j];		
    					}
     
    					packetUDP=null;
    //System.arraycopy(tableauPacket,0 , tab_src, i*size_max_packet, size_max_packet);
     
    				}
    				if((taille_tab_final % size_max_packet) !=0)
    				{
    //Reception du dernier packet qui va contenir un nombre de byte < 1024
    					byte[] tableauPacket_reste=new byte[taille_tab_reste];
    					packetUDP = new DatagramPacket(tableauPacket_reste, tableauPacket_reste.length);
    					socketSrvUDP.receive(packetUDP);
    					for(int k=0;k<taille_tab_reste;k++)
    					{
    						tab_src[nbr_packet*size_max_packet+k]=tableauPacket_reste[k];
    					}
    					packetUDP=null;
    //System.arraycopy(tableauPacket_reste, 0, tab_src, nbr_packet*size_max_packet, taille_tab_reste);
     
    				}
    			}
    			catch(Exception e)
    			{
    				e.printStackTrace();
    			}
     
    		return tab_src;
    		}

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Pourquoi ne pas utiliser un seul DatagramPacket de la taille totale de ton tableau ?

    a++

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    je ne peux pas envoyer un tableau de taille de l'ordre de 350000 dans un seul DatagramPacket parce que d'aprés mes recherches il y'a un taille maximal du tableau (65508) à envoyer dans le DatagramPacket. Donc, je suis obligé de le découper en petit tableau non?
    a+

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Mais d'après la doc l'ordre d'arrivée des DatagramPacket n'est pas garantit (donc ce que tu envois pourrait être très différent de ce que tu reçois).

    Sinon tu pourrais simplifier ton code en évitant une copie inutile et une tableau temporaire supplémentaire, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    	public byte[] RecevoirTabUDP(int taille_tab_final) {
    		int size_max_packet = 1024; // Taille max des pacquets
    		int readCount = 0; // Nom d'élément recu
     
    		// Buffer de données :
    		byte[] tableauPacket = new byte[taille_tab_final];
     
    		try {
    			while (readCount<taille_tab_final) {
    				int length = Math.min(size_max_packet, taille_tab_final-readCount);
    				DatagramPacket packetUDP = new DatagramPacket(
    						tableauPacket, readCount, length);
    				socketSrvUDP.receive(packetUDP);
    				readCount += length;
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
     
    		return tableauPacket;
    	}
    a++

    PS : Et attention à cette gestion des exceptions : en cas d'erreur tu retournes quand même le tableau

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par adiGuba
    Mais d'après la doc l'ordre d'arrivée des DatagramPacket n'est pas garantit (donc ce que tu envois pourrait être très différent de ce que tu reçois).
    Oui je sais c'est l'inconvénient du UDP. En fait ce que je vais faire c'est une étude comparative entre l'envoi d'image avec Socket TCP et UDP et à la fin je vais utiliser les deux protocoles dans mon application (TCP pour l'envoi de mes commandes et UDP pour envoyer du tableau de byte de l'image)

    Merci pour l'optimisation de mon code,
    je vais tester ça
    a+

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Merci adiGuba
    ça améliore les le traitement.

    Une autre question si vous me permettez:avec UDP parfois je reçoit la totalité du tableau de l'image et je peux l'afficher aprés (l'image est correcte et claire) et la majorité de fois ca reste bloquer au niveau de la reception en attente de packet.(packet perdu :c'est le protocole UDP comme on sait) là je doit faire masocket.setReceiveBufferSize(5000) pour ca reste pas bloqué infinement. dans ce cas je vais sortir avec un tableau incomplet ==> l'image va être incomplete et pas clair et meme n'est plus lisible.

    Donc pour résoudre ce probleme je dois ajouter une couche de controle je pense ?j'ai réflechi à pas mal de solution mais je tombe toujours dans le meme problem

    Ma question est: quels sont les controles à faire et comment on va les faire sachant que je veux pas utiliser TCP?

    Merci pour votre aide
    a+

  9. #9
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Si tu donnes à ton serveur le nombre de paquets à recevoir, il est normal qu'il reste en attente si l'un des ces paquets est perdu. Le mieux à faire est de mettre en place un timer qui débloque le serveur au bout d'un certain temps s'il ne reçoit plus rien. Un setSoTimeOut() devrait marcher je pense. Cette méthode bloque la méthode receive() du socket jusqu'à réception où jusqu'à ce que le timeout soit atteint.

Discussions similaires

  1. [Mail] Comment envoyer des e-mails avec PHP
    Par lauryk dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2007, 18h16
  2. [XML] Comment envoyer un flux XML avec SOAP et PHP5 ?
    Par lehic dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 15/06/2007, 17h58
  3. Réponses: 1
    Dernier message: 21/07/2006, 17h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo