Pessoal, sou iniciante no que diz respeito à Sockets e estou desenvolvendo um sistema Cliente/Servidor. O problema é o seguinte, com o código abaixo eu consigo fazer o download de um arquivo, mas preciso fazer o download de vários arquivos e não sei como mudar o código para isso. Segue código:
SERVIDOR
public class FileServer {
private final int BLOCK_SIZE = 1024;
/* Guarda a referencia para o socket do cliente */
private Socket clientSocket;
private ObjectOutputStream output;
private ObjectInputStream input;
private FileInputStream fileReader;
private String [] fileNames;
public FileServer( int port, String sharedDirectory ) {
try {
//Waiting Connections.
// criando um socket que fica escutando a porta passada como parametro.
ServerSocket serverSocket = new ServerSocket( port );
//cria uma conexão e o servidor aceita o cliente
clientSocket = serverSocket.accept();
//Sending files list.
File directory = new File( sharedDirectory );
fileNames = directory.list();
//preparar o outputstream para enviar o arquivo
output = new ObjectOutputStream( clientSocket.getOutputStream() );
output.writeObject( fileNames );
//Wainting request.
input = new ObjectInputStream( clientSocket.getInputStream() );
String fileName = (String) input.readObject();
System.out.println( "SENDING FILE: " + fileName );
//Send requested file.
File fileToUpload = new File( sharedDirectory + File.separator + fileName );
this.sendFile( fileToUpload );
//Close resourses.
input.close();
clientSocket.close();
System.out.println("FINISHED SENDING!");
} catch ( IOException ioex ) {
ioex.printStackTrace();
} catch ( ClassNotFoundException cnfex ) {
cnfex.printStackTrace();
}
}
private void sendFile( File toSend ) throws FileNotFoundException, IOException {
this.fileReader = new FileInputStream( toSend );
//long tamanhoArquivo = enviarPara.comprimento
long fileSize = toSend.length();
//a variavel timesToIterate (tempo de iteração) divide o tamanho do arquivo pelo (tamanho do bloco)BLOCK_SIZE, no caso 1024 permitindo sobras
int timesToIterate = (int) fileSize / BLOCK_SIZE;
//a variavel bytesForLastPackage ( bytes por último pacote) divide o tamanho do arquivo pelo tamanho do BLOCK_SIZE, no caso 1024 admite os restos
//recebe os restos
int bytesForLastPackage = (int) fileSize % BLOCK_SIZE;
if( bytesForLastPackage > 0 ) timesToIterate++;
Message m = null;
byte [] bytes;
//percorrer o arquivo e ir enviando para cliente
for ( int i = 1; i < timesToIterate; i++ ) {
// cria um buffer de 1024 bytes para o envio //BLOCK_SIZE
bytes = new byte[BLOCK_SIZE];
fileReader.read( bytes );
m = new Message( toSend.getName(), timesToIterate );
m.setBytes( bytes );
m.setPackageNumber( i );
output.writeObject( m );
output.flush();
}
//SENDING LAST PACKAGE
if ( bytesForLastPackage > 0 ) {
System.err.println("Sending LAST package with " + bytesForLastPackage + " bytes.");
bytes = new byte[bytesForLastPackage];
fileReader.read( bytes );
m = new Message( toSend.getName(), timesToIterate );
m.setBytes( bytes );
m.setPackageNumber( timesToIterate );
output.writeObject( m );
output.flush();
}
this.fileReader.close();
}
}
Desde já agradeço!