Ciao a tutti... sto realizzando un sistema per interrogare una pagina ASP attraverso un'applet (a dire il vero è un javascript che fa richieste all'applet la quale interroga l'asp) un po' come i remotescripting di microsoft.
Ora il codice l'ho scritto, e sembra funzionare... mi chiedevo se potevate aiutarmi ad ottimizzarlo, io non sono un utente esperto di java e sicuramente ho fatto degli errori. Posto il codice (445 righe):
codice:
/*	Realizzata da AKKAttp S.n.c.
 *
 *
 */

import java.applet.Applet;
import java.awt.Graphics;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;


public class AKKAremote extends Applet{
	
 private Dati d;
 private Leggi leg;
 private Scrivi scr;

 public AKKAremote(){
  d=new Dati();	
 }
 
 public void init(){}
 
 public void setDivisoreDati(String a){
  d.setDivis(a);	
 }
 
 public String getDivisoreDati(){
  return d.getDivis();	
 }

 public void inviaRichiesta(String a){
   scr = new Scrivi(d);
   scr.setIndirizzo(a);
   scr.start();
 }
 
 public String riceviRichiesta(){
  leg = new Leggi(d);
  leg.start();
  while(!d.isInviato()){ }
  repaint();
  scr=null;
  leg=null;
  return d.toString();
 }
 
 public void paint(Graphics g){
  g.drawString("Letto da: "+d.getHost(),10,25 );
  g.drawString("Nome richiesta: "+d.getNome() ,10,40 );
  g.drawString("Stato dati: "+d.getStatoDati() ,10,55);
  g.drawString("Tipo dati: "+d.getTipoDati() ,10,70 );
  g.drawString("Separatore: "+d.getSeparatore(),10,85 );
  g.drawString("Dati: "+ d.getValore(),10,100);
  g.drawString("Flag Errore: "+ d.getFlagErrore(),10,115);
  g.drawString("MSG Errore: "+ d.getMsgErrore(),10,130);
  g.drawString("Str ricevuta: "+ d.getRicevuto(),10,145);
 }
 
 
 /*
 public static void main(String[] args){
  Dati d=new Dati();	
  Scrivi scr = new Scrivi(d);
  scr.setIndirizzo("http://localhost/akkaremote/functions.asp");
  Leggi leg = new Leggi(d);
  scr.start();
  leg.start();
  while(!d.isInviato()){}
  System.out.println("Leggo...: "+d.getValore());
 }
 */
 
}

//***************************** Classe SCRIVI **********************************

class Scrivi extends Thread{
	
 private Dati dati;
 private BufferedReader in;
 private InputStream inputstream;
 private StringTokenizer st;
 private int contaRichiesta=0;
 private String ricevuto="";
 private String indirizzo="";
 
 public Scrivi(Dati v){
  dati=v;
 }
 
 public void run(){
  inserisci(indirizzo);
 }
 
 public void setIndirizzo(String a){
  indirizzo=a;	
 }
 
 public String getIndirizzo(){
  return indirizzo;	
 }
 
 public void inserisci(String a){
  synchronized (dati){
   //try{
    if(!isInterrupted()){
     dati.resetta();
     dati.setHost(a);
     contaRichiesta++;
     dati.setNome("Richiesta n°" + contaRichiesta);
     prendiDati(a);
    }
   //}catch(InterruptedException e){} 
  }
 }
 
 protected void prendiDati(String host){
  URL url;
  dati.setStato(1);
  try{
   url = new URL(host);
   inputstream = (url).openStream();
   dati.setMsgErrore(inputstream.toString());
   in = new BufferedReader(new InputStreamReader(inputstream));
   String line;
   while ((line = riceviMessaggio())!=null){
   	if (line.equals("")) continue;
    dati.setStato(2);
    st = new StringTokenizer(line);
    int count = st.countTokens();
	if(count>=9) break;
   }
   ricevuto=line;
   dati.setRicevuto(ricevuto);
   try{
    String cmd=st.nextToken();
    if(cmd.equals("START")){
   	 cmd=st.nextToken();
   	 if(cmd.equals("TYPE")){
   	  cmd=st.nextToken();
   	  dati.setTipo(calcolaTipo(cmd));
   	  cmd=st.nextToken();
   	  if(cmd.equals("SEP")){
   	   cmd=st.nextToken();
   	   dati.setSeparatore(cmd);
   	   cmd=st.nextToken();
   	   if(cmd.equals("DATA")){
   	    cmd=st.nextToken();
   	    dati.setValore(cmd);
   	    cmd=st.nextToken();
   	    if(cmd.equals("ERROR")){
   	   	 cmd=st.nextToken();
   	   	 if(cmd.equals("0")){
   	   	  dati.setFlagErrore(false);
   	      dati.setMsgErrore("Nessun Errore!");
   	   	 }else{
   	   	  dati.setFlagErrore(true);
   	      dati.setMsgErrore(cmd);
   	   	 }
   	   	 cmd=st.nextToken();
   	   	 if(cmd.equals("END")){
   	   	  dati.setStato(3);
   	   	 }else{
   	   	  dati.setFlagErrore(true);
   	      dati.setMsgErrore("Stringa di ritorno senza terminazione END");
   	   	 }
   	    }else{
   	   	 dati.setFlagErrore(true);
   	     dati.setMsgErrore("Alla stringa di ritorno manca l'ERROR");
   	    }
   	   }else{
   	    dati.setFlagErrore(true);
   	    dati.setMsgErrore("Alla stringa di ritorno manca il DATA");
   	   }
   	  }else{
   	   dati.setFlagErrore(true);
   	   dati.setMsgErrore("Alla stringa di ritorno manca il SEP");
   	  }
   	 }else{
   	  dati.setFlagErrore(true);
   	  dati.setMsgErrore("Alla stringa di ritorno manca il TYPE");
   	 }
    }else{
   	 dati.setFlagErrore(true);
   	 dati.setMsgErrore("Alla stringa di ritorno manca lo START");
    }
   }catch(NoSuchElementException _e){
	dati.setFlagErrore(true);
    dati.setMsgErrore(_e.toString());
   }

   inputstream.close();
   //thread.stop();

  }catch(FileNotFoundException _e){
	dati.setFlagErrore(true);
    dati.setMsgErrore("File Not Found! Manca il file contenente le funzioni lato server.");
  }catch(MalformedURLException _e){
	dati.setFlagErrore(true);
    dati.setMsgErrore("Errore! L'URL non è scritto correttamente.");
  }catch(IOException _e){
	dati.setFlagErrore(true);
    dati.setMsgErrore("Errore di IO nella funzione prendiDati.");
    dati.resetta();
  }
 }
 	
 private String riceviMessaggio() {
  String line = null;
  try {
   line = in.readLine();
  } catch (IOException e) {
    dati.setFlagErrore(true);
    dati.setMsgErrore("Errore di IO nella funzione riceviMessaggio.");
  }
  return line;
 }

 private int calcolaTipo(String a){
  int val;
  if(a.equals("0")) val=0; //null
  else if(a.equals("1")) val=1; //boolean
  else if(a.equals("2")) val=2; //byte
  else if(a.equals("3")) val=3; //int
  else if(a.equals("4")) val=4; //long
  else if(a.equals("5")) val=5; //float
  else if(a.equals("6")) val=6; //double
  else if(a.equals("7")) val=7; //char
  else if(a.equals("8")) val=8; //string
  else if(a.equals("9")) val=9; //array
  else if(a.equals("10")) val=10; //date
  else val=-1; // non esistente
  return val;
 }

}

//***************************** Classe LEGGI ***********************************

class Leggi extends Thread{
	
 Dati dati;
 
 public Leggi(Dati v){
  dati=v;
 }
 
 public void estrapola(){
  synchronized (dati){
   //System.out.println("Sto abilitando la lettura");
   dati.setStato(4);
  }
 }
 
 public void run(){
  estrapola();
 }

}

//***************************** Classe DATI ************************************

class Dati{
 
 private String valore,nome,msgErrore,host,separatore,ricevuto,divis;
 private int stato,tipo;
 private boolean flagErrore;
 
 public Dati(){
  nome="Senza Nome";
  stato=0;
  tipo=8;
  flagErrore=false;
  msgErrore="Nessun Errore!";
  valore="";
  host="";
  separatore="";
  ricevuto="";
  divis="[T]";
 }
 
public void resetta(){
  this.setNome("Senza nome");
  this.setStato(0);
  this.setTipo(8);
  this.setFlagErrore(false);
  this.setMsgErrore("Nessun Errore!");
  this.setValore("");
  this.setSeparatore("");
  this.setRicevuto("");
 }

 public String getNome(){
  return nome;
 }
 
 public String getDivis(){
  return divis;	
 }

 public String getSeparatore(){
  return separatore;
 }

 public String getHost(){
  return host;
 }

 public int getStato(){
  return stato;
 }

 public int getTipo(){
  return tipo;
 }

 public boolean getFlagErrore(){
  return flagErrore;
 }

 public String getMsgErrore(){
  return msgErrore;
 }

 public String getValore(){
  return valore;
 }

 public String getTipoDati(){
  String a;
  switch (tipo){
   case 0: a="null";
   		   break;
   case 1: a="boolean";
   		   break;
   case 2: a="byte";
   		   break;
   case 3: a="int";
   		   break;
   case 4: a="long";
   		   break;
   case 5: a="float";
   		   break;
   case 6: a="double";
   		   break;
   case 7: a="char";
   		   break;
   case 8: a="string";
   		   break;
   case 9: a="array";
   		   break;
   case 10: a="date";
   		   break;
   case -1: a="inesistente";
   		   break;
   default: a="Tipo non compatibile";
  }
  return a;
 }

 public String getStatoDati(){
  String a;
  switch (stato){
   case 0: a="libero";
   		   break;
   case 1: a="inizio";
   		   break;
   case 2: a="incompleto";
   		   break;
   case 3: a="completo";
   		   break;
   case 4: a="inviato";
   		   break;
   default: a="Stato non precisato";
  }
  return a;
 }
 
 public void setDivis(String a){
  divis=a;	
 }
 
 public String getRicevuto(){
  return ricevuto;	
 }

 public void setNome(String a){
  nome=a;
 }

 public void setSeparatore(String a){
  separatore=a;
 }

 public void setHost(String a){
  host=a;
 }

 public void setStato(int a){
  stato=a;
 }

 public void setTipo(int a){
  tipo=a;
 }

 public void setFlagErrore(boolean a){
  flagErrore=a;
 }

 public void setMsgErrore(String a){
  msgErrore=a;
 }

 public void setValore(String a){
  valore=a;
 }
 
 public void setRicevuto(String a){
  ricevuto=a;	
 }
 
 public boolean isLibero(){
  if(stato==0)
   return true;
  else
   return false;	
 }
 
 public boolean isInviato(){
  if(stato==4)
   return true;
  else
   return false;	
 }

 public String toString(){
  String str =this.getFlagErrore()+divis+this.getTipo()+divis+this.getValore()+divis+this.getSeparatore()+divis+this.getMsgErrore();
  return str;
 }
 	
}
Spero che qualcuno colga il mio appello!
Grazie
Rino