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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    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
    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
    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 averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    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
    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
    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 averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    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
    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
    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

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, 17h16
  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, 16h58
  3. Réponses: 1
    Dernier message: 21/07/2006, 16h03

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