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
importjava.io.BufferedReader;importjava.io.DataOutputStream;importjava.io.FileReader;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;publicclassServidor{publicstaticvoidmain(String[]args){intporta=1352;try{ServerSocketservidor=newServerSocket(porta,2);System.out.println("Servidor aberto para conexao...");BufferedReaderbr=newBufferedReader(newFileReader("arquivoservidor.txt"));Stringarquivo=newString();Socketconexao=servidor.accept();try{System.out.println("Antes de aceitar");DataOutputStreamsaida=newDataOutputStream(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(IOExceptione){e.printStackTrace();}System.out.println("Encerrando conexao");}catch(IOExceptione){System.out.println("Erro ao carregar o servidor.");}}}
Cliente
importjava.io.BufferedWriter;importjava.io.DataInputStream;importjava.io.FileWriter;importjava.io.IOException;importjava.net.Socket;importjava.net.UnknownHostException;publicclassCliente{publicstaticvoidmain(String[]args){Stringendereco="127.0.0.1";intporta=1352;Stringlinha=newString();try{Socketconexao=newSocket(endereco,porta);System.out.println("Cliente");try{DataInputStreamentrada=newDataInputStream(conexao.getInputStream());BufferedWriterbr=newBufferedWriter(newFileWriter("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(Exceptione){e.printStackTrace();}conexao.close();}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){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)
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
mariogpr
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:
//Servidorpackagebr.com.teste;importjava.io.BufferedOutputStream;importjava.io.BufferedReader;importjava.io.DataOutputStream;importjava.io.FileReader;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;publicclassServidor{publicstaticvoidmain(String[]args){intporta=5555;try{ServerSocketservidor=newServerSocket(porta,2);System.out.println("Servidor aberto para conexao...");BufferedReaderbr=newBufferedReader(newFileReader("c:\\temp\\teste\\arquivoservidor.txt"));Stringarquivo=newString();Socketconexao=servidor.accept();try{System.out.println("Antes de aceitar");BufferedOutputStreambos=newBufferedOutputStream(conexao.getOutputStream());DataOutputStreamsaida=newDataOutputStream(bos);while((arquivo=br.readLine())!=null){saida.writeUTF(arquivo);}saida.flush();saida.close();bos.close();conexao.close();servidor.close();}catch(IOExceptione){e.printStackTrace();}System.out.println("Encerrando conexao");}catch(IOExceptione){System.out.println("Erro ao carregar o servidor.");}}}
E
//Clientepackagebr.com.teste;importjava.io.BufferedInputStream;importjava.io.BufferedWriter;importjava.io.DataInputStream;importjava.io.FileWriter;importjava.io.IOException;importjava.net.Socket;importjava.net.UnknownHostException;publicclassCliente{publicstaticvoidmain(String[]args){Stringendereco="127.0.0.1";intporta=5555;Stringlinha=newString();try{Socketconexao=newSocket(endereco,porta);System.out.println("Cliente");try{BufferedInputStreambis=newBufferedInputStream(conexao.getInputStream());BufferedWriterbr=newBufferedWriter(newFileWriter("c:\\temp\\arquivocliente.txt",true));DataInputStreamdis=newDataInputStream(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(Exceptione){e.printStackTrace();}finally{conexao.close();}}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}
Nos testes que realizei, está tudo rodando como deve, sem lançar exception.
M
mariogpr
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:
//Servidorpackagebr.com.teste;importjava.io.BufferedOutputStream;importjava.io.BufferedReader;importjava.io.DataOutputStream;importjava.io.FileReader;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;publicclassServidor{publicstaticvoidmain(String[]args){intporta=5555;try{ServerSocketservidor=newServerSocket(porta,2);System.out.println("Servidor aberto para conexao...");BufferedReaderbr=newBufferedReader(newFileReader("c:\\temp\\teste\\arquivoservidor.txt"));Stringarquivo=newString();Socketconexao=servidor.accept();try{System.out.println("Antes de aceitar");BufferedOutputStreambos=newBufferedOutputStream(conexao.getOutputStream());DataOutputStreamsaida=newDataOutputStream(bos);while((arquivo=br.readLine())!=null){saida.writeUTF(arquivo);}saida.flush();saida.close();bos.close();conexao.close();servidor.close();}catch(IOExceptione){e.printStackTrace();}System.out.println("Encerrando conexao");}catch(IOExceptione){System.out.println("Erro ao carregar o servidor.");}}}
E
//Clientepackagebr.com.teste;importjava.io.BufferedInputStream;importjava.io.BufferedWriter;importjava.io.DataInputStream;importjava.io.FileWriter;importjava.io.IOException;importjava.net.Socket;importjava.net.UnknownHostException;publicclassCliente{publicstaticvoidmain(String[]args){Stringendereco="127.0.0.1";intporta=5555;Stringlinha=newString();try{Socketconexao=newSocket(endereco,porta);System.out.println("Cliente");try{BufferedInputStreambis=newBufferedInputStream(conexao.getInputStream());BufferedWriterbr=newBufferedWriter(newFileWriter("c:\\temp\\arquivocliente.txt",true));DataInputStreamdis=newDataInputStream(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(Exceptione){e.printStackTrace();}finally{conexao.close();}}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){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
//Servidorimportjava.io.BufferedOutputStream;importjava.io.BufferedReader;importjava.io.DataOutputStream;importjava.io.FileReader;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;publicclassServidor{publicstaticvoidmain(String[]args){intporta=5555;try{ServerSocketservidor=newServerSocket(porta,2);System.out.println("Servidor aberto para conexao...");BufferedReaderbr=newBufferedReader(newFileReader("c:\\temp\\arquivoservidor.txt"));Stringarquivo=newString();Socketconexao=servidor.accept();try{System.out.println("Antes de aceitar");BufferedOutputStreambos=newBufferedOutputStream(conexao.getOutputStream());DataOutputStreamsaida=newDataOutputStream(bos);while((arquivo=br.readLine())!=null){saida.writeUTF(arquivo);}saida.flush();saida.close();bos.close();conexao.close();servidor.close();}catch(Exceptione){e.printStackTrace();}System.out.println("Encerrando conexao");}catch(IOExceptione){System.out.println("Erro ao carregar o servidor.");}}}