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

10 respostas
T

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

10 Respostas

J
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 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);
		 }
	}

}
e o 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 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(c);
			}
		} catch (IOException e) {
		}
	}
}

Isso deve servir pra copiar

T

Valew brother…vou testar, depois te falo…

[ ]'s Thpjf

T

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

M

: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) {
		}
	}
}
S

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

E

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

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

S

Mas como eu iria implementar isso no java?

A
Megrin:
:) 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) {
		}
	}
}

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

T

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.

A

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

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) {  
        }  
    }
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(C);  

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();



    }  
  
}
Criado 5 de abril de 2010
Ultima resposta 5 de ago. de 2014
Respostas 10
Participantes 8