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

Fwd: Re: [UDP] Gestion des messages et congestion

3 réponses
Avatar
no.bcausse.spam
------- Begin Forwarded Message -------

Subject: Re: [UDP] Gestion des messages et congestion
From: Enis <ebh2@wanadoo.fr>
Newsgroups: fr.comp.lang.java
Date: 15 Jun 2004 03:48:02 -0700

salut

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; //no synchronized voila un gros
probleme pour du multithreading

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....

-------- End Forwarded Message --------


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

3 réponses

Avatar
Bruno Tignac
Salut,

Le mieux dans le cas de communication UDP est :

1. mettre un thread a lire le flux (comme tu le fais) ;
2. preparer un second thread qui consome le flux (Consumer ci dessous).
3. des qu'il y a un msg, add(msg);

public abstract class Consumer implements Runnable {

// faire quelque chose
protected abstract void consume(String pSText) ;

ArrayList coFile = new ArrayList();

public void add(String pSText) {
coFile.add(pSText);
notify();
}

private synchronized void lire() {
try {
this.wait();
if(coFile.size()>0) {
consume((String) coFile.remove(0));
}
}catch(Exception loEx) {
loEx.printStackTrace();
}

}

public void run() {
while(true) {
lire();
}
}

}


Causse Bruno wrote:

------- Begin Forwarded Message -------

Subject: Re: [UDP] Gestion des messages et congestion
From: Enis
Newsgroups: fr.comp.lang.java
Date: 15 Jun 2004 03:48:02 -0700

salut

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; //no synchronized voila un gros
probleme pour du multithreading

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....

-------- End Forwarded Message --------




Avatar
ebh2
salut
en fait j'ai pas compris comment ta classe consumer fonctionne...
ArrayList coFile = new ArrayList();

est ce que c'est l'arraylist que je dois remplir a chaque fois que je
recois une connexion sur udp??

est ce que c'est ca :
public class ConnexionUdp extends Thread
{
..
Arraylist tableau = nArrayList();
..
void run()
{
tableau.add(ce que je recoit de udp)
}

et consumer vient prendre le permier element du tableau a chaque
fois??
en fait je suis pas sur d'avoir bien compris comme marchent les
synchonized et le notify..je vais relire la doc dessus.

enfin...je veux vraiment separer la partie connexion de la partie
traitement.
comment je peux faire ca?
merci
Avatar
ebh2
salut
en fait j'ai pas compris comment ta classe consumer fonctionne...
ArrayList coFile = new ArrayList();

est ce que c'est l'arraylist que je dois remplir a chaque fois que je
recois une connexion sur udp??

est ce que c'est ca :
public class ConnexionUdp extends Thread
{
..
Arraylist tableau = nArrayList();
..
void run()
{
tableau.add(ce que je recoit de udp)
}

et consumer vient prendre le permier element du tableau a chaque
fois??
en fait je suis pas sur d'avoir bien compris comme marchent les
synchonized et le notify..je vais relire la doc dessus.

enfin...je veux vraiment separer la partie connexion de la partie
traitement.
comment je peux faire ca?
merci