[Resolvido] Problema Transferencia de Arquivos utilizando socket

2 respostas
JaVinha1

Opa e aew Galera! :D
Estou com problemas na transferencia de arquivos (uma foto), o arquivo é enviado pelo cliente e chega ao servidor com 0KB e quando encerro o servidor a foto fica com 1,96kb e abre normalmente, o que pode ser?

Vou postar os códigos, estes que veio daqui do fórum, mas já testei a mesma coisa com códigos de outros sites e sempre o mesmo problema... e já pesquisei bastante e nada :oops:

Cliente:
public synchronized void enviarImagem(String caminho)
	{
		 try
			{
			 	File f = new File(caminho);  
		        FileInputStream in = new FileInputStream(f);  
		  
		        System.out.println("Inicio");  
		        OutputStream out = sock.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);
		        System.out.println("Fim");
		        }
			}
			catch(Exception ec)
			{
			}
	}
Servidor:
public synchronized void baixarImagem()
	{
		String nImagem = login + ".jpg";
		try
		{		
			System.out.println("Inicio");
			InputStream in = sock.getInputStream();  
            InputStreamReader isr = new InputStreamReader(in);  
            BufferedReader reader = new BufferedReader(isr);  
            String fName = reader.readLine();  
            System.out.println(fName);  
            File f1 = new File(nImagem);  
            FileOutputStream out = new FileOutputStream(f1);  
            System.out.println("Meio");
                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();
                System.out.println("Fim");
		}
		catch (Exception ec)
		{
		}
	}
-> No console do servidor para com a mensagem "Meio" do System.out.println("Meio"); Até coloquei em métodos synchronized, para ver se tiver concorrencia.. mas num deu certo. O programa completo tem várias classes... Mas a principal do servidor é esta
public ConexaoJogo(Socket s, String l)
	{
		sock = s;
		login = l;

		try
		{	
			InputStream entrada = sock.getInputStream();
			DataInputStream entradaStr = new DataInputStream(entrada);						
			OutputStream saida = sock.getOutputStream();
			DataOutputStream saidaStr = new DataOutputStream(saida);
			while(true)
			{
				int opcao = entradaStr.readInt();
				
				if(opcao == 1)
				{
					
				}
				if(opcao == 2)
				{
					receberMensagem();
				}
				if(opcao == 3)
				{
					baixarImagem();
					//setImagem();
				}
				if(opcao == 4)
				{
					getImagem();
				}
			}
			
		}
		catch(Exception e)
		{
		}
	}

Como da para reparar existe um laço while(true), que logo que termina a execução do método baixarImagem(), fica querendo receber: int opcao = entradaStr.readInt();
Tentei resolver de um monte de formas mas nenhuma com sucesso, por isto que necessito de uma ajudinha, alguma ideia para resolver...
Obrigado

2 Respostas

E

Toda vez que for abrir um arquivo, feche-o com close(). Isso é particularmente importante se você vai gravar nesse arquivo. Você pode fazer isso normalmente como:

OutputStream f = null;
try {
     f = new FileOutputStream (...........);
     f.write (............);
} catch (IOException ex) {
    // trate a exceção
} finally {
    if (f != null) try { f.close(); } catch (IOException e) { }
}

No Java 7 o código acima pode ser simplificado para:

try (
    OutputStream f = new FileOutputStream (..............);
) {
    f.write (.........);
} catch (IOException ex) {
}

No caso do Java 7, se você declarar a abertura do arquivo dentro dos parênteses do try (), você irá solicitar que ele seja automaticamente fechado no fim do try (como se houvesse um “finally”).

JaVinha1

Opa era isto mesmo faltava fechar com o close();
Obrigado!

Criado 27 de janeiro de 2012
Ultima resposta 27 de jan. de 2012
Respostas 2
Participantes 2