Transferencia de arquivos (.txt, .pdf, .tiff) via sockets. Upload and Download

Olá pessoal, estou a procura de alternativas para transferir arquivos via socket, obviamente em java, tando do cliente para o servidor e quanto do servidor p/ o cliente, ou seja upload e download.
Se alguem tiver algo consistente sobre o assunto, postem aqui.

[ ]'s

Cliente:

[code]import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class ClientCopy {
public static void main(String[] args) throws Exception {
Scanner tc = new Scanner(System.in);
System.out.println(“File:”);
String fName = tc.nextLine();

	File f = new File("CAMINHO DE ORIGEM DO FILE/"+fName);
	FileInputStream in = new FileInputStream(f);

	Socket socket = new Socket("IP DO SERIDOR", PORTA);
	OutputStream out = socket.getOutputStream();
	OutputStreamWriter osw = new OutputStreamWriter(out);
	BufferedWriter writer = new BufferedWriter(osw);
	writer.write(f.getName()+"\n");
	writer.flush();
	 int c;
	 while ((c = in.read()) != -1) {
	 System.out.println(c);
	 out.write(c);
	 }
}

}
[/code]

e o servidor

[code]import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerCopy {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(PORTA);
Socket clSocket = server.accept();
InputStream in = clSocket.getInputStream();
InputStreamReader isr = new InputStreamReader(in);
BufferedReader reader = new BufferedReader(isr);
String fName = reader.readLine();
System.out.println(fName);
File f1 = new File(“CAMINO PARA DESTINO DO FILE/” + fName);
FileOutputStream out = new FileOutputStream(f1);
int c;
while ((c = in.read()) != -1) {
out.write©;
}
} catch (IOException e) {
}
}
}
[/code]

Isso deve servir pra copiar

Valew brother…vou testar, depois te falo…

[ ]'s Thpjf

Amigo, a transferencia ta muito lenta…acho que devia estipular um valor pro buffer…talvez melhoraria o desempenho.
se conseguir me fala…
eu vou tentar dar uma mudada no meu codigo e se caso conseguir posto aqui.

Abraços

:slight_smile: Valeu cara este código me ajudou muito…foi só colocar o buffer e funcionou muito bem…
Vlw

Cliente

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {
	public static void main(String[] args) throws Exception {
		Scanner tc = new Scanner(System.in);
		System.out.println("File:");
		String fName = tc.nextLine();

		File f = new File("/home/TTI1/marlon/Documentos/" + fName);
		FileInputStream in = new FileInputStream(f);

		Socket socket = new Socket("localhost", 5678);
		OutputStream out = socket.getOutputStream();
		OutputStreamWriter osw = new OutputStreamWriter(out);
		BufferedWriter writer = new BufferedWriter(osw);
		writer.write(f.getName() + "\n");
		writer.flush();
		int tamanho = 4096; // buffer de 4KB  
	    byte[] buffer = new byte[tamanho];  
	    int lidos = -1;  
	    while ((lidos = in.read(buffer, 0, tamanho)) != -1) {  
	        out.write(buffer, 0, lidos);  
	    }  
	}

}

Servidor

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) {
		try {
			ServerSocket server = new ServerSocket(5678);
			Socket clSocket = server.accept();
			InputStream in = clSocket.getInputStream();
			InputStreamReader isr = new InputStreamReader(in);
			BufferedReader reader = new BufferedReader(isr);
			String fName = reader.readLine();
			System.out.println(fName);
			File f1 = new File("/home/TTI1/marlon/Documentos/novo/" + fName);
			FileOutputStream out = new FileOutputStream(f1);

			    int tamanho = 4096; // buffer de 4KB  
			    byte[] buffer = new byte[tamanho];  
			    int lidos = -1;  
			    while ((lidos = in.read(buffer, 0, tamanho)) != -1) {  
			    	System.out.println(lidos);
			        out.write(buffer, 0, lidos);  
			    }  
			    out.flush();  
		} catch (IOException e) {
		}
	}
}

Estou tentando transfirir arquivos em uma aplicação que seja tolerante a falhas alguem tem ideia de como posso implementar?

[quote=stalin]Estou tentando transfirir arquivos em uma aplicação que seja tolerante a falhas alguem tem ideia de como posso implementar?

[/quote]

Use o esquema do Bit Torrent. Ele é extremamente tolerante a falhas.

Mas como eu iria implementar isso no java?

[quote=Megrin] :slight_smile: Valeu cara este código me ajudou muito…foi só colocar o buffer e funcionou muito bem…
Vlw

Cliente

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {
	public static void main(String[] args) throws Exception {
		Scanner tc = new Scanner(System.in);
		System.out.println("File:");
		String fName = tc.nextLine();

		File f = new File("/home/TTI1/marlon/Documentos/" + fName);
		FileInputStream in = new FileInputStream(f);

		Socket socket = new Socket("localhost", 5678);
		OutputStream out = socket.getOutputStream();
		OutputStreamWriter osw = new OutputStreamWriter(out);
		BufferedWriter writer = new BufferedWriter(osw);
		writer.write(f.getName() + "\n");
		writer.flush();
		int tamanho = 4096; // buffer de 4KB  
	    byte[] buffer = new byte[tamanho];  
	    int lidos = -1;  
	    while ((lidos = in.read(buffer, 0, tamanho)) != -1) {  
	        out.write(buffer, 0, lidos);  
	    }  
	}

}

Servidor

[code]
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(5678);
Socket clSocket = server.accept();
InputStream in = clSocket.getInputStream();
InputStreamReader isr = new InputStreamReader(in);
BufferedReader reader = new BufferedReader(isr);
String fName = reader.readLine();
System.out.println(fName);
File f1 = new File("/home/TTI1/marlon/Documentos/novo/" + fName);
FileOutputStream out = new FileOutputStream(f1);

		    int tamanho = 4096; // buffer de 4KB  
		    byte[] buffer = new byte[tamanho];  
		    int lidos = -1;  
		    while ((lidos = in.read(buffer, 0, tamanho)) != -1) {  
		    	System.out.println(lidos);
		        out.write(buffer, 0, lidos);  
		    }  
		    out.flush();  
	} catch (IOException e) {
	}
}

}
[/code][/quote]

Como acrescentar nesses códigos a possibilidade de mais de um cliente transferir um arquivo ao mesmo tempo?

Pessoal, bom dia!

Sei que o tópico é mais antigo, mas como eu cheguei hoje e utilizei o código postado gostaria de deixar uma dica sobre um erro que encontrei.
No Client ao final do envio do arquivo é necessário fecha o socket, por que caso contrário será apresentado um erro no servidor, segue abaixo a alteração que fiz:

while ((lidos = in.read(buffer, 0, tamanho)) != -1) {    
            out.write(buffer, 0, lidos);    
        }
/*inseri esta linha*/
socket.close();

Caso contrário será apresentado o erro “java.net.SocketException: Connection reset” no servidor ao final da transferência do arquivo.

Galera tenho que fazer uma comunicação TCP/IP. Peguei o codigo desse topico e adaptei. O arquivo aparece criado no cliente/servidor. Porém sem conteúdo ! . Exemplo se encaminho um .txt o conteúdo anotado não aparece; Só o .txt vazio. O mesmo acontece quando encaminho um .jpg, o arquivo é criado , mas sem conteúdo ! Alguém poderia me ajudar ? Obrigado

[code] Servidor

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.;
import java.io.
;

class Server {
public static void main(String[] argv) throws Exception {

    try {  

ServerSocket welcomeSocket = new ServerSocket (6789);
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());

        String fName = inFromClient.readLine();  
        System.out.println(fName);  
        File f1 = new File("/users/adsonAlves/desktop/trabalho redes/envio de arquivo/" + fName);  
        FileOutputStream out = new FileOutputStream(f1);  

            int tamanho = 4096; // buffer de 4KB 4096    
            byte[] buffer = new byte[tamanho];    
            
            





            out.flush();    
    } catch (IOException e) {  
    }  
}  

[/code]

[code]
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
import java.io.;
import java.net.
;

class Client {
public static void main(String argv[]) throws Exception
{

Scanner tc = new Scanner(System.in);

Socket clientSocket= new Socket(“192.168.1.105”,6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

System.out.println(“File:”);
String fName = tc.nextLine();

File C = new File("/users/adsonAlves/desktop/trabalho redes/envio de arquivo/" + fName);

FileInputStream in = new FileInputStream©;

OutputStreamWriter osw = new OutputStreamWriter(outToServer);
BufferedWriter writer = new BufferedWriter(osw);

    writer.write(C.getName() + "\n");  
    writer.flush();  
    int tamanho = 4096; // buffer de 4KB   
    byte[] buffer = new byte[tamanho];    

clientSocket.close();

}  

} [/code]