PDA

Visualizza la versione completa : [JAVA] Uso di socket e stream utilizzando Swing


cala87
05-01-2006, 12:04
Ciao sono di nuovo tornato a chiedere consigli riguardo il mio programma client server di traferimento file che fino a due settimane fa ha richiesto un piccolo aiuto per la risoluzone di un piccolo problema...Ora mi trovo di fronte ad una altro problema :dh: : come avavate detto ho creato una classe che estende thread che mi gestisce l'avvio del server (per non creare problemi con la grafica), questa rimane in attesa fino a quando un utente non si connette al server e quando quest'ultimo connesso genera un thread per la gestione delle operazioni di down/up tra l'utente stesso e il server. Viceversa ho fatto per la classe client: ho creato una clase che estende thread che mi gestisce le operazioni tra client e server; qui che mi nasce il problema, attraverso l'utilizzo dei socket e degli stream devo trasmettere le informazioni attraverso dei flussi di byte, in pratica succede che il cliebnt mi invia correttamente i flussi ma il thread di gestione operazioni tra server e client non riesce a ricevere nulla, nonostante il fatto che i dati dai flussi vengano letti nell'ordine corretto...

Potete aiutarmi??? :bh:

Grazie ciao

cala87
05-01-2006, 15:23
Se serve aggiungo il codice... :confused:

kuarl
06-01-2006, 12:26
mica ho capito... la connessione viene stabilita?

cala87
06-01-2006, 13:29
certo..la connessione stabilita in modo corretto...

cala87
06-01-2006, 14:54
Questo il thread con cui gestisco le operazioni del server




import java.io.*;
import java.util.*;
import java.net.*;

public class ThreadServer extends Thread
{
byte[] BufferNomeFile, BufferListaFile;
int IDClient,LunghezzaNomeFile;
File CartellaCondivisa;
InputStream Ingresso;
OutputStream Uscita;
FileInputStream LeggiFile;
FileOutputStream ScriviFile;
Server ServerAttivo;
Socket SocketIngresso;
String Indirizzo,
Richiesta,
NomeFile;

public ThreadServer(Socket SocketIngresso, int IDSocket, String Indirizzo, Server ServerAttivo, File CartellaCondivisa)
{
this.SocketIngresso = SocketIngresso;
this.IDClient = IDClient;
this.Indirizzo = Indirizzo;
this.ServerAttivo = ServerAttivo;
this.CartellaCondivisa = CartellaCondivisa;
}

public void run()
{
try
{
while(true)
{
Ingresso = SocketIngresso.getInputStream();
Uscita = SocketIngresso.getOutputStream();

RiceviRichiesta();

if(Richiesta.equals("files"))
{
ServerAttivo.Scrivi("Richiesta files inoltrata da: ");
ServerAttivo.Scrivi("\tClient " + IDClient + "@" + Indirizzo);
InviaListaFile();
}
else
if(Richiesta.equals("download"))
{
InviaLunghezzaFile();
//InviaFile();
}
else
if(Richiesta.equals("upload"))
{
RiceviFile();
}
else
if(Richiesta.equals("disconnetti"))
{
break;
}
}

stop();
}
/*catch(InterruptedException e)
{
ServerAttivo.Scrivi("Client " + IDClient + "@" + Indirizzo + " disconnesso");
}*/
catch(Exception e)
{
ServerAttivo.Scrivi("Caduta connessione Client " + IDClient + "@" + Indirizzo);
}
}

public String[] ListaFileServer()
{
File[] Files = CartellaCondivisa.listFiles();
int Contatore = 0;

for(int i=0;i<Files.length;i++)
{
if(Files[i].isFile())
{
Contatore++;
}
}

String[] NomiFiles = new String[Contatore];
Contatore = -1;

for(int i=0;i<Files.length;i++)
{
if(Files[i].isFile())
{
Contatore++;
NomiFiles[Contatore] = Files[i].getName();
}
}

return NomiFiles;
}

public void InviaListaFile()
{
try
{
ServerAttivo.Scrivi("Invio lista files a Client " + IDClient + "@" + Indirizzo);
String[] ListaFile = ListaFileServer();
String Cartella = CartellaCondivisa.getName();

Uscita.write(ListaFile.length);

BufferListaFile = new byte[CartellaCondivisa.getName().length()];
BufferListaFile = CartellaCondivisa.getName().getBytes("US-ASCII");
Uscita.write(CartellaCondivisa.getName().length()) ;
Uscita.write(BufferListaFile);


for(int i=0;i<ListaFile.length;i++)
{
BufferListaFile = new byte[ListaFile[i].length()];
BufferListaFile = ListaFile[i].getBytes("US-ASCII");
Uscita.write(ListaFile[i].length());
Uscita.write(BufferListaFile);
}

ServerAttivo.Scrivi("Lista file inviata a " + IDClient + "@" + Indirizzo);
}
catch(IOException e)
{
ServerAttivo.Scrivi("Errore nella spedizione della lista a " + IDClient + "@" + Indirizzo);
}

}

public void RiceviFile()
{
ServerAttivo.Scrivi("Pronto a ricevere " + NomeFile);
ServerAttivo.Scrivi("Inizio ricezione file...");

/*try
{

}
catch(IOException e)
{

}*/
}

public void RiceviRichiesta()
{
try
{
ServerAttivo.Scrivi("Ricezione richiesta");
LunghezzaNomeFile = Ingresso.read();
BufferNomeFile = new byte[LunghezzaNomeFile];
Ingresso.read(BufferNomeFile);
Richiesta = new String(BufferNomeFile,"US-ASCII");
ServerAttivo.Scrivi("Richiesta: " + Richiesta);
}
catch(IOException e)
{
ServerAttivo.Scrivi("Connessione utente persa");
}
}

public void InviaLunghezzaFile()
{
try
{
RiceviRichiesta();

NomeFile = new String(BufferNomeFile,"US-ASCII");
File fileRichiesto = new File(CartellaCondivisa,NomeFile);
byte LungFile = (byte)fileRichiesto.length();
Uscita.write(LungFile);
}
catch(IOException e)
{
ServerAttivo.Scrivi("Impossibile inviare lunghezza file selezionato");
}
}
}



ps gurdate soltanto la prima funzione di ricezione richiesta ed ipotizzate che la prima richiesta sia files...

cala87
06-01-2006, 14:57
Questa la classe che gestisce le operazioni del client..




import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.net.*;
import javax.swing.*;
import javax.swing.event.*;

public class GestisciClient extends Thread
{
Errore finErrore;
Client client;
String Indirizzo;
int Porta,LunghezzaRichiesta;
byte[] BufferListaFile,NomeFileBuffer;
Socket socketServer;
InputStream Ingresso;
OutputStream Uscita;

public GestisciClient(Client client,String Indirizzo,int Porta)
{
this.client = client;
this.Indirizzo = Indirizzo;
this.Porta = Porta;
}

public void run()
{
try
{
Connetti(Indirizzo,Porta);
InviaRichiesta("files");
RiceviFiles();

while(!interrupted())
{

}
}
catch(IOException e)
{
client.Scrivi("Impossibile connettersi al server");
}

}

public void Connetti(String Indirizzo,int Porta) throws IOException
{
if(Porta > 0 && Porta < 65536)
{
socketServer = new Socket(Indirizzo,Porta);

client.Scrivi("Connesso al server " + Indirizzo + "@" + Porta);

Ingresso = socketServer.getInputStream();
Uscita = socketServer.getOutputStream();

client.Scrivi("Componenti per la ricezione dati attivati!");
}
else
{
finErrore = new Errore(client,"Porta del server sbagliata");
finErrore.setVisible(true);
}
}

public void Disconnetti()
{
try
{
socketServer.close();
interrupt();
stop();
}
catch(IOException e)
{
finErrore = new Errore(client,"Impossibile chiudere la connessione");
finErrore.setVisible(true);

client.Scrivi("Errore nella chiusura della connessione");
}
}

public void InviaRichiesta(String Richiesta)
{
try
{
client.Scrivi("Invio richiesta file in corso");
LunghezzaRichiesta = Richiesta.length();
NomeFileBuffer = new byte[LunghezzaRichiesta];
NomeFileBuffer = Richiesta.getBytes("US-ASCII");
Uscita.write(LunghezzaRichiesta);
Uscita.write(NomeFileBuffer);
Uscita.flush();
client.Scrivi("Richiesta inviata!");
}
catch(IOException e)
{
client.Scrivi("\nServer non attivo!");
Disconnetti();
}
}

public void RiceviFiles()
{
int LunghezzaElemento,
Elementi;

try
{
client.Scrivi("Ricezione lista");
Elementi = Ingresso.read();
client.Scrivi(Integer.toString(Elementi));
client.DatiServer = new String[2][Elementi];

LunghezzaElemento = Ingresso.read();
BufferListaFile = new byte[LunghezzaElemento];
client.Ingresso.read(BufferListaFile);

client.DatiServer[0][0] = new String(BufferListaFile,"US-ASCII");

client.Scrivi("Inizio trasferimento della lista");
if((Elementi) != 0)
{
for(int i=0;i<Elementi;i++)
{
LunghezzaElemento = Ingresso.read();
BufferListaFile = new byte[LunghezzaElemento];
Ingresso.read(BufferListaFile);
client.DatiServer[1][i] = new String(BufferListaFile,"US-ASCII");
}
client.Scrivi("Trasferimento lista completato!");
}
else
{
client.Scrivi("Nessun file da scaricare!!");
client.Scrivi("Prova a caricare dei file e riconnettiti!!");
}

client.AlberoServer = new Hashtable();
client.AlberoServer.put(client.DatiServer[0][0],client.DatiServer[1]);

client.PannelloDiviso.remove(client.CartellaServer );
client.CartellaServer = new JTree(client.AlberoServer);
JScrollPane Scroll = new JScrollPane(client.CartellaServer);

client.PannelloDiviso.setOneTouchExpandable(true);
client.PannelloDiviso.setDividerLocation(190);
client.PannelloDiviso.setDividerSize(10);
client.PannelloDiviso.setContinuousLayout(true);
client.PannelloDiviso.setLeftComponent(Scroll);

}
catch(IOException e)
{
client.Scrivi("Errore nella ricezione dei file");
client.Scrivi("Disconnessione in corso...");
Disconnetti();
client.Scrivi("Disconnesso");
}
}

public void stopClient()
{
Disconnetti();
}


}




i files che dovrebbe dspedirmi il server devono essere scritti in un componente JTree preesistente attraverso l'utilizzo delle hashtable...ciao grazie

Loading