Erro transmitir linha a linha .txt por Socket

5 respostas
M

Boa tarde;

Eu estou tentando simular um "ftp" e transmitir o conteudo de um arquivo .txt linha a linha e gravar em outro arquivo .txt

Ele transmite e está gravando, porém, da um erro;

Segue código;

Servidor
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Servidor {

	public static void main(String[] args) {
		int porta = 1352;

			try {
				ServerSocket servidor = new ServerSocket(porta, 2);
				System.out.println("Servidor aberto para conexao...");
				
				BufferedReader br = new BufferedReader(new FileReader("arquivoservidor.txt"));
				String arquivo = new String();
				
				Socket conexao = servidor.accept();
				
					try {
		
						System.out.println("Antes de aceitar");
						
						DataOutputStream saida = new DataOutputStream(conexao.getOutputStream());
						
						//System.out.println(br.readLine());
						
						while ((arquivo = br.readLine()) != null) {
							saida.writeUTF(arquivo);
							saida.flush();
						}
		
						saida.flush();
						saida.close();
						conexao.close();
						servidor.close();
					
		
					} catch (IOException e) {
						e.printStackTrace();
					}
	
				
	
				System.out.println("Encerrando conexao");
			} catch (IOException e) {
				System.out.println("Erro ao carregar o servidor.");
				}
	}
}
Cliente
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;


public class Cliente {

	 public static void main(String[] args) {
		 
		  String endereco = "127.0.0.1";
		  int porta = 1352;
		  String linha = new String();
		  
		  		try {
		   
					   Socket conexao = new Socket(endereco,porta);
					   
					   System.out.println("Cliente");
					   
					   try {
						   
						   DataInputStream entrada = new DataInputStream(conexao.getInputStream());
							
						   BufferedWriter br = new BufferedWriter(new FileWriter("arquivocliente.txt"));
						   
						   
						   	while((linha=entrada.readUTF()) != null){	//O erro acontece nesse while					   			
						   		    br.write(linha +"\n\r");
								    br.write("\n\r");
								    br.flush();
							   }
							   
						   
						  entrada.close();
						  br.close();
						   
					   	} catch (Exception e) {
					   		e.printStackTrace();
					   	}
					   
					   conexao.close();
					   
				  } catch (UnknownHostException e) {
				   e.printStackTrace();
				  } catch (IOException e) {
				   e.printStackTrace();
				  }

		  
		 }
}

O arquivo está sendo criado e gravado corretamente, porém, aparece esse erro;

java.io.EOFException
	at java.io.DataInputStream.readUnsignedShort(Unknown Source)
	at java.io.DataInputStream.readUTF(Unknown Source)
	at java.io.DataInputStream.readUTF(Unknown Source)
	at Cliente.main(Cliente.java:30)

Quem puder ajudar, agradeço;

5 Respostas

JuniorMaia

porque tu usa quebra de linha? “\n\r”

M

Eu estou fazendo aqui na empresa;

Quando testei em casa, só passando “\n” estava quebrando linha, agora, testando aqui, tive que passar desse jeito;

Edit:

Ah, eu uso quebra de linha pq estou passando linha e linha e gravando no arquivo, se eu não quebrar linha, vai ficar tudo na mesma no arquivo de destino;

M

ninguém me respondeu =<

Eu conversei com o professor, ele falou que essa é uma exceção que sempre vai ocorrer quando transmitidos arquivos pela web e que devemos tratar no try/catch, porém, deixando a parte do catch vazio, assim não imprimindo nada;

Eu entendo que isso não está correto… deve-se ter algum modo de não cair desse catch;

Agradeço quem puder ajudar;

drsmachado
Fala Mário, tranquilo? Então, vi seu tópico e resolvi dar uma olhada com mais atenção. Em algumas pesquisas, descobri que o erro é ocasionado pois o objeto de DataInputStream (no caso, entrada) não consegue gerenciar as informações lidas quando o Socket é fechado. Fiz algumas alterações tanto no Servidor quanto no Cliente e os resultados são estes:
//Servidor
package br.com.teste;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
  
public class Servidor {  
  
    public static void main(String[] args) {  
        int porta = 5555;  
  
            try {  
                ServerSocket servidor = new ServerSocket(porta, 2);  
                System.out.println("Servidor aberto para conexao...");  
                  
                BufferedReader br = new BufferedReader(new FileReader("c:\\temp\\teste\\arquivoservidor.txt"));  
                String arquivo = new String();  
                  
                Socket conexao = servidor.accept();  
                  
                    try {  
          
                        System.out.println("Antes de aceitar");  
                            
                        BufferedOutputStream bos = new BufferedOutputStream(conexao.getOutputStream());
                        DataOutputStream saida = new DataOutputStream(bos);
                          
                        while ((arquivo = br.readLine()) != null) {  
                            saida.writeUTF(arquivo);
                        }  

                        saida.flush();
                        saida.close();  
                        bos.close();  
                        conexao.close();  
                        servidor.close();  
                      
          
                    } catch (IOException e) {  
                        e.printStackTrace();  
                    }  
      
                  
      
                System.out.println("Encerrando conexao");  
            } catch (IOException e) {  
                System.out.println("Erro ao carregar o servidor.");  
                }  
    }  
}
E
//Cliente
package br.com.teste;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
  
  
public class Cliente {  
  
     public static void main(String[] args) {  
           
          String endereco = "127.0.0.1";  
          int porta = 5555;  
          String linha = new String();  
            
                try {  
             
                       Socket conexao = new Socket(endereco,porta);  
                         
                       System.out.println("Cliente");  
                         
                       try {  
                             
                           BufferedInputStream bis = new BufferedInputStream(conexao.getInputStream());
                           
                           BufferedWriter br = new BufferedWriter(new FileWriter("c:\\temp\\arquivocliente.txt", true));  
                             
                           DataInputStream dis = new DataInputStream(bis);
                             
                            while((linha=dis.readUTF()) != null){   //O erro acontece nesse while               
                                    br.write(linha);
                                    br.write("\n");
                                    br.flush();  
                               }  
                                 
                             
                          dis.close();
                          bis.close();
                          br.close();     
                        } catch (Exception e) {  
                            e.printStackTrace();  
                        } finally{
                            conexao.close();
                        }
                         
                  } catch (UnknownHostException e) {  
                   e.printStackTrace();  
                  } catch (IOException e) {  
                   e.printStackTrace();  
                  }  
  
            
         }  
}
Nos testes que realizei, está tudo rodando como deve, sem lançar exception.
M
drsmachado:
Fala Mário, tranquilo? Então, vi seu tópico e resolvi dar uma olhada com mais atenção. Em algumas pesquisas, descobri que o erro é ocasionado pois o objeto de DataInputStream (no caso, entrada) não consegue gerenciar as informações lidas quando o Socket é fechado. Fiz algumas alterações tanto no Servidor quanto no Cliente e os resultados são estes:
//Servidor
package br.com.teste;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
  
public class Servidor {  
  
    public static void main(String[] args) {  
        int porta = 5555;  
  
            try {  
                ServerSocket servidor = new ServerSocket(porta, 2);  
                System.out.println("Servidor aberto para conexao...");  
                  
                BufferedReader br = new BufferedReader(new FileReader("c:\\temp\\teste\\arquivoservidor.txt"));  
                String arquivo = new String();  
                  
                Socket conexao = servidor.accept();  
                  
                    try {  
          
                        System.out.println("Antes de aceitar");  
                            
                        BufferedOutputStream bos = new BufferedOutputStream(conexao.getOutputStream());
                        DataOutputStream saida = new DataOutputStream(bos);
                          
                        while ((arquivo = br.readLine()) != null) {  
                            saida.writeUTF(arquivo);
                        }  

                        saida.flush();
                        saida.close();  
                        bos.close();  
                        conexao.close();  
                        servidor.close();  
                      
          
                    } catch (IOException e) {  
                        e.printStackTrace();  
                    }  
      
                  
      
                System.out.println("Encerrando conexao");  
            } catch (IOException e) {  
                System.out.println("Erro ao carregar o servidor.");  
                }  
    }  
}
E
//Cliente
package br.com.teste;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
  
  
public class Cliente {  
  
     public static void main(String[] args) {  
           
          String endereco = "127.0.0.1";  
          int porta = 5555;  
          String linha = new String();  
            
                try {  
             
                       Socket conexao = new Socket(endereco,porta);  
                         
                       System.out.println("Cliente");  
                         
                       try {  
                             
                           BufferedInputStream bis = new BufferedInputStream(conexao.getInputStream());
                           
                           BufferedWriter br = new BufferedWriter(new FileWriter("c:\\temp\\arquivocliente.txt", true));  
                             
                           DataInputStream dis = new DataInputStream(bis);
                             
                            while((linha=dis.readUTF()) != null){   //O erro acontece nesse while               
                                    br.write(linha);
                                    br.write("\n");
                                    br.flush();  
                               }  
                                 
                             
                          dis.close();
                          bis.close();
                          br.close();     
                        } catch (Exception e) {  
                            e.printStackTrace();  
                        } finally{
                            conexao.close();
                        }
                         
                  } catch (UnknownHostException e) {  
                   e.printStackTrace();  
                  } catch (IOException e) {  
                   e.printStackTrace();  
                  }  
  
            
         }  
}
Nos testes que realizei, está tudo rodando como deve, sem lançar exception.

Olá Darlan;

Beleza, eai?

Então, fiz as modificações que demonstrou, porém continua lançando exception;

java.io.EOFException
	at java.io.DataInputStream.readUnsignedShort(Unknown Source)
	at java.io.DataInputStream.readUTF(Unknown Source)
	at java.io.DataInputStream.readUTF(Unknown Source)
	at Cliente.main(Cliente.java:30)
Meu código
//Servidor

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
	
	public class Servidor {
	
		public static void main(String[] args) {
			int porta = 5555;
	
				try {
					ServerSocket servidor = new ServerSocket(porta, 2);
					System.out.println("Servidor aberto para conexao...");
					
					BufferedReader br = new BufferedReader(new FileReader("c:\\temp\\arquivoservidor.txt"));
					String arquivo = new String();					
					
					Socket conexao = servidor.accept();
					
					try {
						
						System.out.println("Antes de aceitar");
						
						 BufferedOutputStream bos = new BufferedOutputStream(conexao.getOutputStream());  
	                     DataOutputStream saida = new DataOutputStream(bos);  
								
								while ((arquivo = br.readLine()) != null) {
									saida.writeUTF(arquivo);
								}
				
								saida.flush();
								saida.close();
								bos.close();
								conexao.close();
								servidor.close();

						
					} catch (Exception e) {
						e.printStackTrace();
					}
					
					System.out.println("Encerrando conexao");
				} catch (IOException e) {
					System.out.println("Erro ao carregar o servidor.");
				}
		}
}
//Cliente
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;


public class Cliente {

	 public static void main(String[] args) {
		 
		  String endereco = "127.0.0.1";
		  int porta = 5555;
		  String linha = new String();
		  
		  		
		   try{
					   Socket conexao = new Socket(endereco,porta);
					   
					   System.out.println("Cliente");
					   
					   try {
						
						   BufferedInputStream bis = new BufferedInputStream(conexao.getInputStream()); 						   					
						   BufferedWriter br = new BufferedWriter(new FileWriter("c:\\temp\\arquivocliente.txt", true));						   
						   DataInputStream entrada = new DataInputStream(bis);		
							   
							   	while((linha=entrada.readUTF()) != null){						   			
							   			br.write(linha +"\n\r");
									    br.write("\n\r");
									    br.flush();
								   }
								   
							   
							  entrada.close();
							  br.close();			   
						      conexao.close();
						      
					} catch (Exception e) {
						e.printStackTrace();
					}finally{
						conexao.close();
					}
				
		   }catch(UnknownHostException e){
			   e.printStackTrace();
		   }catch(IOException e){
			   e.printStackTrace();
		   }
		  
		 }
}

O erro acontece quando esse while pega a ultima linha do texto de origem, ou seja, a linha que é nula;

while((linha=dis.readUTF()) != null){   //O erro acontece nesse while                 
                                    br.write(linha);  
                                    br.write("\n");  
                                    br.flush();    
                               }
Criado 29 de outubro de 2012
Ultima resposta 1 de nov. de 2012
Respostas 5
Participantes 3