Vários arquivos viram um só (socket)

3 respostas
A

Boa tarde pessoal!

Estou com problemas para enviar mais de um arquivo via socket…
Se eu tento enviar os arquivos um a um, o meu servidor recebe corretamente, porém, quando tento enviar dentro de um laço de repetição verificando todos os arquivos da pasta, ele gera apenas um arquivo no servidor com o tamanho igual a soma dos tamanhos dos arquivos. =\

Sei que o correto seria implementar um protocolo de comunicação, mas não tenho idéia de como faze-lo. Mas a única coisa próxima disso que encontrei foi “KnockKnockProtocol”.
Se alguém puder me ajudar com alguma dica, lhe serei muito grato! rsrs

Segue abaixo o meu código para que vocês possam criticar alguma coisa também.

import java.io.*;
import java.net.Socket;

public class ListFiles {
	public static void main(String[] args) {
	    
		File dir = new File("c:\\receive\\pqp");   
	    String [] children = dir.list();
	    FileInputStream in = null;
	    OutputStream out = null;
	    OutputStreamWriter osw = null;
	    BufferedWriter writer = null;
	    File f = null;
	    if (children == null) {  
	        // Either directory does not exist or is not a directory  
	    } 
	    else 
	    {  
	    	try
	    	{
		    	Socket socket = new Socket("localhost", 5678);
		        for (int i=0; i<children.length; i++) 
		        {  
		            // Get filename of file or directory  
		            String filename = children[i];
		            System.out.println("Filename...");
		            try
		            {
		            	f = new File("C:/receive/pqp/" + filename);
		            	System.out.println(f.getName());
		            	in = new FileInputStream(f);
		    	        out = socket.getOutputStream();
		    	        osw = new OutputStreamWriter(out);
		    	        writer = new BufferedWriter(osw);
		    	        writer.write(f.getName() + "\n");
		    	        writer.flush();
		    	        int tamanho = (int) f.length(); // buffer de 4MB    
		    	        byte[] buffer = new byte[tamanho];    
		    	        int lidos = -1;
		    	        while ((lidos = in.read(buffer, 0, tamanho)) != -1) 
		    	        {
		    	            out.write(buffer, 0, lidos);
		    	            System.out.println("Lidos = " + lidos);
		    	            if (lidos == tamanho){
		    	            	System.out.println("BREAK!");
		    	            	break;
		    	            }
		    	        }
		    	        out.flush();
		    	        writer.flush();
		            } 
		            catch (Exception e)
		            {
		            	e.printStackTrace();
		            }
		            finally{
		            	System.out.println("FINALLY!");
		            	in.close();
		            	out.flush();
		            	osw.flush();
		            	//writer.close();
		            }
		        }
	        }
	    	catch (IOException e)
	        {
	        	e.printStackTrace();
	        }
	    }
	}
}

Desde já agradeço!

3 Respostas

A

cara,

pq vc não compacta seus arquivos em zip no cliente e envia para o servidor e ela vc descompacta os arquivos.

t+

A

Vlw pela sugestão, alissonvla!
Mas assim teria uma intervenção minha no processo, eu o objetivo era de disponibilizar esses arquivos no servidor da mesma forma que eles estão na máquina do cliente.

O que eu preciso é mais de uma implementação de um protocolo de comunicação mesmo, mas não encontrei documentação a este respeito com socket.

=\

A

cara,

se vc fizer desse jeito, nao funciona?

try {
			Socket socket = new Socket("localhost", 5678);
			
			File dir = new File("c:\\receive\\pqp");
			for(File arquivo : dir.listFiles()){
				PrintWriter cliente = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));

				cliente.println(new FileInputStream(arquivo));
				cliente.flush();
			}
		} catch (UnknownHostException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}

t+

Criado 28 de novembro de 2011
Ultima resposta 29 de nov. de 2011
Respostas 3
Participantes 2