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

[UDP] Gestion des messages et congestion

4 réponses
Avatar
ebh2
salut j'ai une connexion udp avec laquelle je recois des messages et
ensuite j'effetcure plusieurs operations sur ces messages
reception
tache 1
tache 2
.
.
seulement le temps que j'effecture toutes mes taches sur le message
recu ya une nouvelle reception et je perds des infos que je soustrait
de ces messages.
je vais essayer de resoudre le probleme en rajoutant un buffer
danslequel je stocke les messages et je les traite une par une (un
fifo).

ya t il un moyen plus simple(une libraire, un exemple de code...)pour
effectuer ceci : ne pas perdre des messages sur la reception et
pouvoir effectuer toutes les operations sur le message n avant de
passer au message n+1 ??

merci d'avance

4 réponses

Avatar
TestMan
Bonjour,
Tu mets en place un thread d'écoute qui remplit ta pile FIFO,
Ensuite ne te reste plus qu'a traiter cette pile avec un ou plusieurs
thread de traitements.

Au passage, ne pas oublier que UDP n'est pas "fiable", contrairement à
TCP. Si par contre tu cherches qqch de fiable et souple, essaye
Javagroups, ça fait meme du multicast fiable.

Top :)

A+
TM

Enis wrote:

salut j'ai une connexion udp avec laquelle je recois des messages et
ensuite j'effetcure plusieurs operations sur ces messages
reception
tache 1
tache 2
.
.
seulement le temps que j'effecture toutes mes taches sur le message
recu ya une nouvelle reception et je perds des infos que je soustrait
de ces messages.
je vais essayer de resoudre le probleme en rajoutant un buffer
danslequel je stocke les messages et je les traite une par une (un
fifo).

ya t il un moyen plus simple(une libraire, un exemple de code...)pour
effectuer ceci : ne pas perdre des messages sur la reception et
pouvoir effectuer toutes les operations sur le message n avant de
passer au message n+1 ??

merci d'avance


Avatar
ebh2
salut
en fait j'ai pas opte pour un buffer dans lequel mettre les octets
recus du message udp mais plutot pour un arraylist. mais utiliser un
buffer serait peut etre plus optimal (un ByteBuffer ou autre...)

seulement j'ai toujours des problemes...soit je perds toujours des
messages...soit l'interface se bloque....toute aide serait la
bienvenue....merci

voila le code pour la connexion
[code]
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

public class ConnexionUdp extends Thread {

private DatagramSocket datagramSocket = null;
private byte[] buffer;
public DatagramPacket datagramPacket;

public static List dataUdpList;

public ConnexionUdp(final int port, int tailleBuffer) throws
IOException {

buffer = new byte[tailleBuffer];
datagramPacket = new DatagramPacket(buffer, buffer.length);
dataUdpList = new ArrayList();

try {

datagramSocket = new DatagramSocket(port);

} catch (SocketException e) {

e.printStackTrace();

}

}

public void run() {

try {
while (true) {

datagramSocket.receive(datagramPacket);

byte[] bufferdata = new byte[datagramPacket.getLength()];

System.arraycopy(
datagramPacket.getData(),
0,
bufferdata,
0,
datagramPacket.getLength());

dataUdpList.add(bufferdata);
Traitements traitements = new Traitements();
traitements.run();

//sauvegarde.run();

}
} catch (IOException e1) {

e1.printStackTrace();
}

}

}

[/code]
et pour le traitements(les taches que j'effectue et qui ne sont que de
simple fonctions de manipulations d'octets)
[code]

public class Traitements extends Thread {
public byte[] bufferdata;

public Traitements() {

bufferdata = (byte[]) ConnexionUdp.dataUdpList.get(0);

}

public void run() {

Tache1(bufferdata);
Tache2(bufferdata);
.
.

ConnexionUdp.dataUdpList.remove(0);

}

}

[/code]
voila comme a chaque fois j'enleve le premier element faudra juste que
je rajoute un test qd la liste n'as plus d'element...mais en tt cas ca
simule une fifo...mais ca marche pas....
Avatar
no.bcausse.spam
Enis wrote:

salut


salut, j'ai merdé dans le suivi ;(

en fait j'ai pas opte pour un buffer dans lequel mettre les octets
recus du message udp mais plutot pour un arraylist. mais utiliser un
buffer serait peut etre plus optimal (un ByteBuffer ou autre...)

seulement j'ai toujours des problemes...soit je perds toujours des
messages...soit l'interface se bloque....toute aide serait la
bienvenue....merci




voila le code pour la connexion
[code]
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

public class ConnexionUdp extends Thread {

private DatagramSocket datagramSocket = null;
private byte[] buffer;
public DatagramPacket datagramPacket;

public static List dataUdpList;


list et donc arraylist a des methodes non synchronized, voila qui est un
gros probleme avec du multithreading.... changes avec un vecteur et test
a te lire


public ConnexionUdp(final int port, int tailleBuffer) throws
IOException {

buffer = new byte[tailleBuffer];
datagramPacket = new DatagramPacket(buffer, buffer.length);
dataUdpList = new ArrayList();

try {

datagramSocket = new DatagramSocket(port);

} catch (SocketException e) {

e.printStackTrace();

}

}

public void run() {

try {
while (true) {

datagramSocket.receive(datagramPacket);

byte[] bufferdata = new byte[datagramPacket.getLength()];

System.arraycopy(
datagramPacket.getData(),
0,
bufferdata,
0,
datagramPacket.getLength());

dataUdpList.add(bufferdata);
Traitements traitements = new Traitements();
traitements.run();

//sauvegarde.run();

}
} catch (IOException e1) {

e1.printStackTrace();
}

}

}

[/code]
et pour le traitements(les taches que j'effectue et qui ne sont que de
simple fonctions de manipulations d'octets)
[code]

public class Traitements extends Thread {
public byte[] bufferdata;

public Traitements() {

bufferdata = (byte[]) ConnexionUdp.dataUdpList.get(0);

}

public void run() {

Tache1(bufferdata);
Tache2(bufferdata);
.
.

ConnexionUdp.dataUdpList.remove(0);

}

}

[/code]
voila comme a chaque fois j'enleve le premier element faudra juste que
je rajoute un test qd la liste n'as plus d'element...mais en tt cas ca
simule une fifo...mais ca marche pas....



--
bruno Causse
http://perso.wanadoo.fr/othello

Avatar
ebh2
voila ce que j'ai fait:
ca marche pas....pourtant toutes mes methodes sont synchronise...
aussi qd je fait ca :
ThreadTraitements.currentThread().notify le thread ne se lance
jamais....
et qd j'enleves les deux methodes synchroised pour le wait et le
notify..je perd des message lors du traitements...
kelkun a un exemple de code pour faire ca correctement?
merci


public class ConnexionUdp extends Thread
{
private static List dataUdpLiast;
public synchronized void run()
{

try
{
while (true)
{
datagramSocket.receive(datagramPacket);

Thread remplissage = new Thread()

{
public synchronized void run()
{
try
{
RemplirArray. remplir (datagramPacket.getData());
}
catch (IOException e)
{

e.printStackTrace();
}
}
};
remplissage.start();
//System.out.println(dataUdpList.size());

synchronized(ThreadTraitements.currentThread())
{
ThreadTraitements.currentThread().notify();
}



}
}
catch (IOException e1)
{

e1.printStackTrace();
}

}


}
et voici mon thread de traitement :

public class ThreadTraitements extends Thread
{
public void run()
{
while(true)
{


synchronized(this) {
try {
wait();
} catch(InterruptedException e) {
throw new RuntimeException(e);
}
}
ConnexionUdp.getDataUdpList().get(0);
Traitement1
Traitement 2…

ConnexionUdp.getDataUdpList().remove(0);


}



}
}
}

seulement ca ne marche pas….kelkun a une idee ?


public class RemplirArray extends ConversionsTypes
{


public static synchronized void remplir(byte[] buffer) throws
IOException
{

ConnexionUdp.getDataUdpList().add(new Model(buffer));

//Model etant une classe que je cree a partir du datagram recu
}
}