Ai galera tenho o codigo abaixo que transfere direitinho o arquivo para o servidor. To com uma dúvida oq ue eu tenho que alterar e implementar para conseguir transferir esse arquivo em partes tipo 50 em 50 bytes ?
Abraços
Cliente.java
[code]
import java.net.;
import java.io.;
import java.io.File;
public class Client {
public static void main(String a[]) {
int c;
Socket cltskt=null;
PrintWriter writeskt=null;
File f = new File("c:/TesteClient.txt");
try {
FileInputStream fin = new FileInputStream(f.getAbsolutePath());
try {
cltskt=new Socket("127.0.0.1",4001);
System.out.println(cltskt);
}
catch(Exception e) { e.printStackTrace(); }
try {
writeskt=new PrintWriter(cltskt.getOutputStream(),true);
BufferedReader readskt = new BufferedReader(new InputStreamReader(cltskt.getInputStream()));
while((c = fin.read()) != -1) {
writeskt.println©;//to write to the socket
//System.out.print(Integer.parseInt(readskt.readLine()));
}
} catch(Exception e) {e.printStackTrace(); }
try {
fin.close();
}catch(IOException e) {}
}catch(FileNotFoundException e) { }
}
}[/code]
Servidor.java
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server
{
public static void main(String a[])
{
ServerSocket serskt=null;
PrintWriter writeskt=null;
int rep;
try {
FileOutputStream fout = new FileOutputStream("c:/TesteServer.txt");
try {
serskt=new ServerSocket(4001);
System.out.println("Socket preparado .......\n");
}
catch(Exception e) { e.printStackTrace(); }
try {
System.out.println("Aguardando conexão ...\n");
Socket listen=serskt.accept();
System.out.println("Uma Conexão foi realizada ...\n");
writeskt=new PrintWriter(listen.getOutputStream(),true);
BufferedReader readskt = new BufferedReader(new InputStreamReader(listen.getInputStream()));
System.out.println("Transferindo arquivo ...\n");
try {
while((rep = Integer.parseInt(readskt.readLine())) != -1) {
//System.out.print(rep);
fout.write(rep);
writeskt.println(rep);
}
fout.close();
} catch(IOException e){}
writeskt.close();
readskt.close();
} catch(Exception e) { System.out.println(e); e.printStackTrace(); }
}catch(FileNotFoundException e){}
}
}
Comecei a fazer um teste,desculpa se coloquei coisas demais, mas a intenção é ir tentar fazendo depois aprimorando.
Bem o codigo abaixo mostra direitinho em quantas partes quebra, lá no for ele vai por exemplo de um arquivo de 169 bytes, ele mostra:
Transferindo de 0 a 50
transferindo de 51 a 101
transferindo de 52 a 151
Trasnferindo de 151 a 169
Estou indo para o caminho certo ???
Parece que so falta trasnferir a partir desses limitadores, enfim preciso de ajuda e dicas.
Codigo que imprimi o descrito acima abaixo:
Client2.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
public static void main(String a[]) {
boolean sobrou=false;
int result;
Socket socket = null;
PrintWriter escrevre = null;
File arquivo = new File("c:/TesteClient.txt"); //O arquivo :)
long tamanhoArquivo = 0; //Tamanho do arquivo que será armazenado posteriormente
long tamanhoMaximo = 50; // Tamanho máximo do arquivo a ser enviado ( em bytes )
long numPartes = 0; //Número de partes em que o arquivo poderá ser quebrado
long etapas = 1; //Número de etapas = numero de partes
int ultimaParte = 0 , //Caso a ultima parte do arquivo seja menor que 50 armazena o total a ser enviado
inicio = 0,fim = 0; //Inicio e final da leitura do arquivo
try {
//Abrimos um FileInputStream para o arquivo
FileInputStream fin = new FileInputStream(arquivo.getAbsolutePath());
try {
socket = new Socket("127.0.0.1",4001);
//debugs
System.out.println("Conectado....");
}
catch(Exception e) { e.printStackTrace(); }
try {
//Cria uma instancia para enviarmos o arquivo para o destino.
//O parametro tru indica que o arquivo será enviado a cada println
escrevre = new PrintWriter(socket.getOutputStream(),true);
//BufferedReader readskt = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//Pega o tamanho do arquivo
tamanhoArquivo = fin.getChannel().size();
//Debugs
System.out.println("O arquivo possui tamanho de " + tamanhoArquivo + " bytes.");
//Calcula em quantas partes o arquivo poderá ser dividido.
numPartes = tamanhoArquivo/tamanhoMaximo;// + (tamanhoArquivo % tamanhoMaximo == 0 ? 0 : 1 ) ;
//Se o resto da divisão não for 0 incrementa mais um, armazena o resto que sobrou
//para chegar no tamanhoMaximo e coloca true na variável que verifica se sobrou resultado.
if( !(tamanhoArquivo % tamanhoMaximo == 0) ) {
numPartes++;
sobrou = true;
ultimaParte = (int) (tamanhoArquivo % tamanhoMaximo);
}
//Debugs
System.out.println("O arquivo pode ser quebrado em "+ numPartes + " partes.");
System.out.println("Arquivo sendo transferido em "+numPartes+" etapas ...");
for( int i = 1 ; i <= numPartes ; i++) {
System.out.println("Etapa "+i);
// Se for a primeira Etapa e sobrou true
if( i==1 && i<numPartes ) {
fim = (int) tamanhoMaximo;
}
//Se não for a primeira Etapa e sobrou false
if( i>1 && i<numPartes ) {
inicio = inicio + (int) tamanhoMaximo + 1;
fim = fim + (int) tamanhoMaximo + 1;
}
//Se não for a primeira Etapa e sobrou true
else if( i>1 && i==numPartes && sobrou ) {
inicio = inicio + (int) tamanhoMaximo + 1;
fim = (int) tamanhoArquivo;
}
System.out.println("Transferindo Inicio: " + inicio + " bytes Fim: "+fim+" bytes");
//result = fin.read(bytesParte, inicio, fim);//Le o arquivo
//System.out.println(Integer.toString(result, 2));
}
/*while((result = fin.read()) != -1) {
escrevre.println(result);//to write to the socket
System.out.println(Integer.toString(result, 2));
}*/
} catch(Exception e) {e.printStackTrace(); }
try {
fin.close();
}catch(IOException e) {}
}catch(FileNotFoundException e) { }
}
}
