Newsgroup: it.comp.java
Titolo: Java??:...Prestazioni indecenti!!!!

Salve, da circa un anno mi diverto a programmare in java, ma solo da qualche
mese lo sto utilizzando seriamente (ovvero per fare copse "serie"), in
particolare ho implementato una classe molto semplice che legge dei
pacchetti da un flusso multicast e, senza toccarli, li rispedisce su un
altro flusso multicast... risultato??... Sul flusso in uscita vedo un
pacchetto ogni morte di papa (e mi rifertisco ai papi degli ultimi secoli ..
tranne il penultimo!).. forse non sarò un gran programmatore per cui, se vi
va, provate a fare lo stesso anche voi e fatemi sapere!!
Ciao!

va, provate a fare lo stesso anche voi e fatemi sapere!!
Mi sembra di capire che cmq si tratti di un processo IO bound.
Secondo me le prestazioni non dovrebbero subire allora un
degrado cosi' significativo.

Infatti sembra strano anche a me... sinceramente non so cosa pensare.
Sicuramente non si tratta del mio pc o della mia rete perché ho provato il
programma anche su altri pc di un'altra rete ed il risultato é stato lo
stesso.
Ti propongo il sorgente di una versione semplificata del programma (a
differenza di questa, la versione completa prevede due thread, uno in
lettura, l'altro in scrittura sui due indirizzi multicast, collegati con due
pipedstream, inoltre tutte le operazioni di IO sono bufferizzate... ma per
quanto riguarda le prestazioni non c'é una grossa differenza)
Penso di inviare un'email al gruppo per ri-proporre a tutti il mio problema.
Spero che qualcuno possa aiutarmi!
(é necessaria la jdk 1.1.8)
_________________________________________________________________________
 /* Questa classe riceve pacchetti datagram da un flusso multicast e li
redirige su un altro flusso
/  Usage: java MulticastRedirector InputIpAddress InputPort OutputIpAddress
OutputPort timeout
*/
import java.io.*;
import java.net.*;
public class MulticastRedirector {
 final static int MAX_PACKET_LENGTH = 65509; // massima lunghezza di un
datagram ip
 public static void main(String [] args) {
  InetAddress inputAddress; // indirizzo multicast del flusso in ingresso
  InetAddress outputAddress;// indirizzo multicast del flusso in uscita
  int inputPort, outputPort, timeout;
  byte[] inBlock = new byte[MAX_PACKET_LENGTH];   // buffer x i dati in
ingresso
  byte[] outBlock = new byte[MAX_PACKET_LENGTH]; // buffer x i dati in
uscita
  try
   // Ricava i valori dei due InetAddress e delle due porte
   try{
    inputAddress  = InetAddress.getByName(args[0]);
    outputAddress  = InetAddress.getByName(args[2]);
   }
   catch (UnknownHostException e) {
    inputAddress  = InetAddress.getByName(args[0]);
    outputAddress  = InetAddress.getByName(args[2]);
   }
   inputPort = Integer.parseInt(args[1]);
   outputPort = Integer.parseInt(args[3]);
   timeout = Integer.parseInt(args[4]);
   /* In base ai valori immessi crea due MulticastSocket collegati
   /  alle porte indicate e poi li aggancia ai due indirizzi ip multicast
   */
   MulticastSocket multicastInputSocket = new MulticastSocket(inputPort);
   MulticastSocket multicastOutputSocket = new MulticastSocket(outputPort);
   multicastInputSocket.joinGroup(inputAddress);
   multicastOutputSocket.joinGroup(outputAddress);
   /* fissa il timeout per il socket in ingresso (in millisecondi),
   /  dopo questo tempo verrà sollevata un'eccezione InterruptedIOException
   */
   multicastInputSocket.setSoTimeout(timeout*1000);
   System.out.println("Socket creati, inizio la redirezione...");
   /* crea due DatagramPacket che verranno usati per ricevere
   /  e per ri-tramettere. Ogni datagram ha un suo buffer
   / (si può provare ad usare lo stesso buffer, ma non cambia molto)
   */
   DatagramPacket inputDP = new DatagramPacket(inBlock,MAX_PACKET_LENGTH);
   DatagramPacket outputDP = new DatagramPacket(outBlock,MAX_PACKET_LENGTH,
outputAddress, outputPort);
   /* riceve i pacchetti datagram da un socket e li ri-trasmette sull'altro,
   /  finché il socket di ingresso non va in timeout.
   */
   int c=0;
   while (true) {
    multicastInputSocket.receive(inputDP);
    System.arraycopy(inBlock,0,outBlock,0,MAX_PACKET_LENGTH);
    multicastOutputSocket.send(outputDP);
    // questa riga può servire a controllare il funzionamento del programma
    // System.out.println("Pacchetto "+(c++)+" ricevuto e trasmesso...");
   }
  }
  catch (NumberFormatException nfe) {
   System.err.println(nfe);
   System.err.println("Usage: java MulticastRedirector InputIpAddress
InputPort OutputIpAddress OutputPort timeout
");
   System.exit(1);
  }
  catch (InterruptedIOException ioe) {
   System.exit(1);
   System.err.println("Timeout!");
  }
  catch (Exception e) {
   System.err.println("Eccezione:"+e.toString());
   System.exit(1);
  }
 }
}