Problema conexão, transferencia e manipulação de arquivo
40 respostas
R
RyuSayajin
Ola pessoal,
bem faz tempo q não mexo com o java e querendo voltar, decidi criar uma aplicação para manipular um arquivo excel, blz até ai tudo bem, mas ai querendo avançar mais, decidi manipular este arquivo de outro computador, mas não sei como fazer…
gostaria de uma ajuda nessa parte…
tipo to querendo manipular ele no local que ele está
D
dreampeppers99
Sim, mas de uma forma (seja por Stream) ou de outra (baixando ele completament [abstraindo o stream]) voce vai trazer o conteudo para o computador que vai fazer o processamento. Pode usar Stream e coloca-lo num servidor web (apache http, ou tomcat) via rede mesmo (samba).
R
RyuSayajin
mmmmm entendi, poderia me ajudar, pelo menos com um exemplo se não for pedir muito…
R
RyuSayajin
desculpa, dei uma olhada no Stream e não sei se é isso, deixa eu explicar melhor…
tem o arquivo A no pc B, quero manipular o arquivo A do pc C mas deixar no pc B… ± isso… isso seria possível?
M
matheuslmota
Então cara, se você quiser manipular o arquivo no computador onde o arquivo está, basta você usar a seguinte estrutura:
O objeto bufferedReader possui os métodos de leitura para manipular o arquivo.
É essa a sua dúvida?
R
RyuSayajin
quase la, é mais de como eu consigo pegar o arquivo se ele está em outro computador…
desculpe minha ignorância.
R
RyuSayajin
acho que meu problema está em como fazer pra acessar o outro pc, procurar o arquivo, trazer esse arquivo para aplicação que está no meu pc, modificar o conteúdo do arquivo e mandar de volta para o pc de origem.
sim, mas ai vou precisar de fazer isso também no pc que está o arquivo?
R
redr4gon
vc precisa do servidor e do cliente pra trabalhar com os sockets… logico…
a nao ser que faz via web nesse caso o usuario precisa aceitar a manipulação do arquivo e vc faz o que disseram ae de usar stream e alterar…
se vc pensa em manipular sem programa cliente, o consentimento do cliente ou algo assim, dae ja nem da
R
RyuSayajin
Pronto consegui uma conexao com outro pc, mas apenas chat, agora vem o problema de como juntar o chat com o manipulador de arquivo…vou postar os codigos a seguir.
R
RyuSayajin
os codigos do chat
Servidor.java
importjava.io.IOException;importjava.io.PrintStream;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.ArrayList;importjava.util.List;publicclassServidor{publicstaticvoidmain(String[]args)throwsIOException{newServidor(12345).executa();}privateintporta;privatebooleanencerrar;privateList<PrintStream>clientes;publicServidor(intporta){this.porta=porta;this.clientes=newArrayList<PrintStream>();}privatevoidexecuta()throwsIOException{ServerSocketservidor=newServerSocket(this.porta);System.out.println("Porta 12345 aberta");while(!encerrar){Socketcliente=servidor.accept();System.out.println("Nova conexão com o cliente "+cliente.getInetAddress().getHostAddress());PrintStreamps=newPrintStream(cliente.getOutputStream());this.clientes.add(ps);TrataClientetc=newTrataCliente(cliente.getInputStream(),this);newThread(tc).start();}}publicvoiddistribuiMensagem(Stringmsg){for(PrintStreamcliente:this.clientes){cliente.println(msg);}}}
Cliente.java
importjava.io.IOException;importjava.io.PrintStream;importjava.net.Socket;importjava.net.UnknownHostException;importjava.util.Scanner;publicclassCliente{privateStringhost;privateintporta;publicstaticvoidmain(String[]args)throwsUnknownHostException,IOException{newCliente("127.0.0.1",12345).executa();}publicCliente(Stringhost,intporta){this.host=host;this.porta=porta;}publicvoidexecuta()throwsUnknownHostException,IOException{Socketcliente=newSocket(this.host,this.porta);System.out.println("O cliente se conectou ao servidor!");Recebedorr=newRecebedor(cliente.getInputStream());newThread(r).start();Scannerteclado=newScanner(System.in);PrintStreamsaida=newPrintStream(cliente.getOutputStream());while(teclado.hasNextLine()){saida.println(teclado.nextLine());}saida.close();teclado.close();cliente.close();}}
agora manipulador de arquivo excel so leitura
classe1.java
importjava.io.File;importjava.io.IOException;importjxl.Cell;importjxl.Sheet;importjxl.Workbook;importjxl.read.biff.BiffException;publicclassclasse1{publicstaticvoidmain(String[]args)throwsBiffException,IOException{/** * Carrega a planilha */Workbookworkbook=Workbook.getWorkbook(newFile("exemplo.xls"));/** * Aqui é feito o controle de qual aba do xls * será realiza a leitura dos dados */Sheetsheet=workbook.getSheet(0);/** * Numero de linhas com dados do xls */intlinhas=sheet.getRows();intcolunas=sheet.getColumns();for(intj=0;j<linhas;j++){for(inti=0;i<colunas;i++){Cellcelula=sheet.getCell(i,j);System.out.println("Conteúdo da célula na linha "+j+", coluna "+i+": "+celula.getContents());}}}}
M
matheuslmota
Cara, o seguinte código faz a leitura de um arquivo remotamente:
URL url = new URL("http://ipDoPc/diretorio/arquivo");
URLConnection pcRemoto = url.openConnection();
pcRemoto.setConnectTimeout(7000);//Timeout de 7 segundos;
BufferedReader in = new BufferedReader(new InputStreamReader(pcRemoto.getInputStream(), "ISO-8859-1")); //Coloque no ultimo parâmetro o charset do arquivo.
Use isso para ler o arquivo.
Você pode ir lendo o arquivo e escrever o conteúdo em um arquivo temporário (que está no seu PC).
Localmente você verifica o arquivo e caso necessário, você pode seobrescrever o arquivo que está na máquina remota.
O objeto URL possui um métod getFile(), que retorna o arquivo que está naquele endereço. Use-o para pegar o arquivo a ser seobrescrito.
Abs.
R
RyuSayajin
tentei fazer isso matheus, mas está dando erro na linha 4
M
matheuslmota
Ajudaria muito se você colocasse a mensagem do erro.
R
RyuSayajin
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.MalformedURLException;importjava.net.URL;importjava.net.URLConnection;publicclassa{publicstaticvoidmain(String[]args){URLurl;URLConnectionpcRemoto;try{url=newURL("http://ip/caminho/teste.xlsx");try{pcRemoto=url.openConnection();url.getFile();pcRemoto.setConnectTimeout(7000);// Timeout de 7 segundos;BufferedReaderincoming=newBufferedReader(newInputStreamReader(pcRemoto.getInputStream(),"ISO-8859-1"));}catch(IOExceptione){e.printStackTrace();}}catch(MalformedURLExceptione){e.printStackTrace();}}}
Cara, esqueci de um detalhe, depois da linha 19, você tem que chamar o método connect:
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.MalformedURLException;importjava.net.URL;importjava.net.URLConnection;publicclassa{publicstaticvoidmain(String[]args){URLurl;URLConnectionpcRemoto;try{url=newURL("http://ip/caminho/teste.xlsx");try{pcRemoto=url.openConnection();url.getFile();pcRemoto.setConnectTimeout(7000);// Timeout de 7 segundos;pcRemoto.connect();// Chamada que havia sido omitidaBufferedReaderincoming=newBufferedReader(newInputStreamReader(pcRemoto.getInputStream(),"ISO-8859-1"));}catch(IOExceptione){e.printStackTrace();}}catch(MalformedURLExceptione){e.printStackTrace();}}}
Desculpe pela omissão. :oops:
R
RyuSayajin
matheus ainda ta com erro…
pcRemoto.connect();// Chamada que havia sido omitidaBufferedReaderincoming=newBufferedReader(newInputStreamReader(pcRemoto.getInputStream()));
talvez seja o caminho que estou colocando errado… como você colocaria se o arquivo estivesse no C:\Users\Fulano\Desktop\teste.xlsx
M
matheuslmota
MAs ai é que tá. Esse código que eu te passei é pra acessar o arquivo que está em outro pc. Tu tem que colocar o IP da máquina onde o arquivo está junto com o caminho do arquivo:
URLurl=newURL("//192.168.1.1/diretorio/arquivo");
Eu coloquei esse ip de exemplo. Isso serve pra você acessar um arquivo em um computador em uma rede. Note que o arquivo deve está em uma pasta compartilhada.
R
RyuSayajin
matheus fiz tudo o que você me disse e continua o mesmo erro, to achando que é melhor fazer como um chat que ai consigo uma conexão com o pc em questão, e apartir dai tenho como botar estrutura de comando pra achar o arquivo e manipulalo(eu acho que isso é possivél)
M
matheuslmota
Cara, tu tá colocando o IP errado. Essa exceção diz que a aplicação não tá encontrando o servidor. Vai lá na máquina que tu tá querendo se conectar e roda o seguinte código:
Isso retorna o IP da máquina na rede. O teu problema é unicamente de IP. Tu tem que descobrir o IP correto da outra máquina.
M
matheuslmota
Me tira uma curiosidade. Essa máquina que você está querendo acessar está na mesma rede que a máquina que está rodando a aplicação?
R
RyuSayajin
sim, é maquina la do trabalho e todas estão em rede…
M
matheuslmota
Cara,
–> Rode na máquina que você quer ser conectar o código que eu postei para encontrar o IP;
–> Coloque o arquivo a ser manipulado em uma pasta compartilhada (no pc que você quer se conectar);
–> Passe o IP que você achou para o construtor do objeto URL mais o caminho da pasta compartilhada: URL url = new URL("//ip/pastaCompartilhada/Arquivo");
Foi dessa forma que você procedeu?
R
RyuSayajin
o do meu colega eu testei para meu pc e deu esse erro
java.io.FileNotFoundException:http://ip/Publico/teste.xlsatsun.net.www.protocol.http.HttpURLConnection.getInputStream(UnknownSource)atteste.a.main(a.java:23)packageteste;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.MalformedURLException;importjava.net.URL;importjava.net.URLConnection;publicclassa{publicstaticvoidmain(String[]args){URLurl;URLConnectionpcRemoto;try{url=newURL("http://ip/Publico/teste.xls");try{pcRemoto=url.openConnection();url.getFile();pcRemoto.setConnectTimeout(7000);// Timeout de 7 segundos;pcRemoto.connect();// Chamada que havia sido omitidaBufferedReaderincoming=newBufferedReader(newInputStreamReader(pcRemoto.getInputStream()));}catch(IOExceptione){e.printStackTrace();}}catch(MalformedURLExceptione){e.printStackTrace();}}}
O programa não está encontrando o arquivo nesse computador.
do meu pra ele deu esse erro
RyuSayajin:
java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.<init>(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at a.main(a.java:19)
Aqui ele diz que não tá se conectando ao pc remoto porque não tá achando o IP.
Você tem certeza que está usando o ip correto?
Vamos chamar a máquina com a qual você está querendo se conectar de servidor.
A sua máquina é o cliente.
Você deve rodar a aplicação no computador cliente e ela tem que chamar o IP do servidor.
Você está usando o IP correto?
A planilha se encontra em uma pasta compartilhada?
R
RyuSayajin
sim a todos as perguntas
M
matheuslmota
Cara, no lugar de URL, usa URI, com ftp:
URI uri = new URI("ftp://ip/diretorio/arquivo");
File file = new File(uri);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
Cara, vamos tentar uma abordagem diferente.
Vamos usar sockets
Tu cria uma aplicação servidora simples usando ServerSocket e uma aplicação cliente usando Sockets. O problema dev ser alguma frescura de permissão do windows (faz até sentido, já pemsou se qualquer um pudesse criar um programa pra pegar um arquivo qualquer de seu pc…).
Você vai ter que fazer duas aplicações, uma servidora, que vai ficar na máquina que tu quer pegar o arquivo, e uma cliente, que vai ficar na máquina que vai receber o arquivo e manipulá-lo.
Entendeu?
R
RyuSayajin
verdade, e com sockets eu consegui uma conexão com o pc do meu colega só não sei fazer é fazer a aplicação dele me mandar o arquivo para minipular na minha aplicação
testei no meu pc e funcionou, daqui a pouco vou testar entre pcs pra ver se vai e se tudo der certo vou postar todo codigo aqui mudar o titulo para “[RESOLVIDO]Problema conexão, transferencia e manipulação de arquivo” para pesquisa posteriores XD
M
matheuslmota
Ainda bem que minha ajuda serviu pra alguma coisa. Tava ficando contragido já, não tava dando nenhuma bola dentro
Mas quando terminar posta mesmo a solução, para os nossos colegas que virão a ter a mesma dúvida.
[]'s
R
RyuSayajin
funcionou tudo perfeito, mas eu queria devolver o arquivo para o local de origem…
eu não entendi como que ele faz para transferir…
FileServer.java
importjava.net.*;importjava.io.*;publicclassFileClient{publicstaticvoidmain(String[]args)throwsIOException{intfilesize=6022386;// filesize temporary hardcodedlongstart=System.currentTimeMillis();intbytesRead;intcurrent=0;// localhost for testingSocketsock=newSocket("127.0.0.1",13267);System.out.println("Connecting...");// receive filebyte[]mybytearray=newbyte[filesize];InputStreamis=sock.getInputStream();FileOutputStreamfos=newFileOutputStream("exemplo.xls");BufferedOutputStreambos=newBufferedOutputStream(fos);bytesRead=is.read(mybytearray,0,mybytearray.length);current=bytesRead;// thanks to A. Cádiz for the bug fixdo{bytesRead=is.read(mybytearray,current,(mybytearray.length-current));if(bytesRead>=0)current+=bytesRead;}while(bytesRead>-1);bos.write(mybytearray,0,current);bos.flush();longend=System.currentTimeMillis();System.out.println(end-start);bos.close();sock.close();}}
M
matheuslmota
Essa aplicação é unidericional. O servidor manda o arquivo para o cliente e o cliente armazena o arquivo localmente. É só você fazer que tanto o servidor como o cliente possam enviar e receber arquivos. O servidor possui um algoritmo para enviar arquivos e o cliente possui um algoritmo para receber arquivos.
Dei uma comentada no código que envia arquivos para ver se fica mais claro:
Socket socket = new Socket("127.0.0.1", 13267);//cria uma conexão com o servidor
File file = new File("exemplo.xls");
FileInpuStream fiStream = new fileInputStream(file);//cria uma Stream para ler o arquivo
BufferedInputStream bufferedReadrer = new BufferedInputStream(fiStream);//Cria um buffer para armazenamento temporário dos bytes lidos do arquivo
byte[] bufferBytes = new bytes[(int)file.length()]; //Aloca um buffer de bytes do tamanho do arquivo
OutputStream out = socket.getOutputStream();//Pega o OutputStream do socket. O OutputStream serve para enviar bytes para o socket
bufferedReader.read(bufferBytes, 0, bufferBytes.length());// Lê o arquivo e o armazena no buffer de bytes
out.write(bufferBytes, 0, bufferBytes.length());//Escreve o conteúdo do buffer de bytes no OutputStream do socket.
out.flush();//Esvazia o OutputStream
R
RyuSayajin
oi matheus, obrigado por tudo…
apareceu uma duvida como posso separar por metodos e enviar um comando para o servidor para receber o arquivo?
M
matheuslmota
Cara, você sabe mexer com Threads? Eu acho interessante que você crie duas Thread da seguinte forma:
–> Uma envia o arquivo através de sockets para a aplicação cliente
–> Outra recebe o arquivo de volta do cliente
R
RyuSayajin
Yo, consegui fazer uma aplicação com tudo até agora, mas não consigo mandar de volta pro servidor, só consigo receber dele…
pode me ajudar nesta questão que está me tirando de minha paz interior. :x
packageservico;importjava.net.*;importjava.io.*;publicclassFileClient{publicvoidreceberFile()throwsIOException{intfilesize=6022386;// filesize temporary hardcodedlongstart=System.currentTimeMillis();intbytesRead;intcurrent=0;// localhost for testingSocketsock=newSocket("127.0.0.1",13267);System.out.println("Connecting...");// receive filebyte[]mybytearray=newbyte[filesize];InputStreamis=sock.getInputStream();FileOutputStreamfos=newFileOutputStream("exemplo.xls");BufferedOutputStreambos=newBufferedOutputStream(fos);bytesRead=is.read(mybytearray,0,mybytearray.length);current=bytesRead;do{bytesRead=is.read(mybytearray,current,(mybytearray.length-current));if(bytesRead>=0)current+=bytesRead;}while(bytesRead>-1);bos.write(mybytearray,0,current);bos.flush();longend=System.currentTimeMillis();System.out.println(end-start);bos.close();sock.close();}}
packageteste;importjava.awt.BorderLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.IOException;importservico.*;importjavax.swing.JButton;importjavax.swing.JFrame;publicclassMeuNoteextendsJFrameimplementsActionListener{privateJButtonbotao1=newJButton("Receber arquivo");publicMeuNote(){// Define o título da janelasuper("Meu Notepad");this.montaJanela();}privatevoidmontaJanela(){botao1.addActionListener(this);this.getContentPane().add(botao1,BorderLayout.NORTH);setSize(640,480);this.setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);}publicvoidactionPerformed(ActionEventevent){try{newFileClient().receberFile();}catch(IOExceptione){e.printStackTrace();}}publicstaticvoidmain(String[]args){// Cria objeto:newMeuNote();try{newFileServer().sendFile();}catch(IOExceptione){e.printStackTrace();}}}