Boa tarde a todos!
Estou com dificuldades na criação de um programa em Java.
Preciso criar um programa em que, estando instalado em outras maquinas, seja possivel a comunicação entre os programas via wireless. O programa basicamente é para troca de arquivos, ou seja, disponibilizando um arquivo no programa de uma maquina, ele estara disponivel para os outros programas nas outras maquinas.
Devera ter tambem um programa central que controla os outros, liberando ou travando a comunicação entre os terminais.
Alguem pode me ajudar?
É só fazer um programa TCP/IP comum. Para o Java, é indiferente se a comunicação é via Wi-Fi ou rede cabeada. Aliás, para qualquer comunicação TCP/IP é indiferente.
F
Frings
Certo.
Então se a comunicação cliente/servidor funcionar numa rede cabeada, ela funcionará também numa rede wireless??
Pois fiz parte da aplicação que estou desenvolvendo, e através de uma rede cabeada, consigo fazer a comunicação e a troca de mensagens. Mas quando tentei por wireless, não consegui. Preciso ter um roteador para dar certo ou atraves de algum outro tipo de conexão sem fio (ad hoc por exemplo) pode dar certo?
PS: Possuo um notebook com Windows 7 Professional SP1 e um desktop com Windows XP Professional SP3.
Agradeço a ajuda!
R
rmendes08
dá certo sim. antes de testar sua aplicação faça um teste da rede. Abra o prompt de comando do windos e chame o comando ping, para verificar se o host está alcançável.
F
Frings
Obrigado. Parece que agora deu certo por conexão sem fio. Foi um problema de endereçamento ip.
Agora preciso fazer a troca de arquivos entre os clientes. Vou procurar me informar sobre isso.
Muito Obrigado,
F
Frings
Boa tarde,
Fiz a aplicação para troca de arquivos. O cliente envia o arquivo ao servidor e o mesmo é recebido.
O problema é que o arquivo recebido tem um extensão no mínimo esquisita.
Por exemplo: Se eu selecionar o arquivo “Imagem.jpg” para ser enviado, o mesmo é enviado e recebido, mas é recebido como “Imagem.jpg����”.
Segue os trechos de código…
Servidor
@Overridepublicvoidrun(){try{System.out.println("Conectado ao Cliente...");JOptionPane.showMessageDialog(null,"Conectado a Cliente: "+client.getInetAddress().getHostAddress());BufferedReaderinput=newBufferedReader(newInputStreamReader(client.getInputStream()));Stringcaminho=input.readLine();Filearquivo=newFile(caminho.trim());InputStreamin=client.getInputStream();//File arquivo = new File("<caminho a ser salvo no servidor>"); OutputStreamout=newFileOutputStream(arquivo);byte[]buf=newbyte[4096];intlen;while((len=in.read(buf))>0){out.write(buf,0,len);}out.flush();out.close();//JOptionPane.showMessageDialog(null, "Transferência concluÃda com sucesso!"); System.out.println("Transferência Concluída com Sucesso!");client.close();}catch(Exceptionex){ex.printStackTrace();//JOptionPane.showMessageDialog(null, "Algum erro com ocorreu (Servidor)..."); System.exit(1);}}
Cliente
@OverridepublicvoidenviaArquivo(Stringpath){Filef=newFile(path);try{Socketsocket=newSocket(this.getIpDoServidor(),this.getPorta());OutputStreamout=socket.getOutputStream();//File arquivo = new File("<caminho do arquivo>"); - AQUI JÁ TENHO UM FILE f QUE POSSUI O CAMINHO DO ARQUIVO InputStreamin=newFileInputStream(f);Stringnome=f.getName().trim();out.write(nome.getBytes());byte[]buf=newbyte[4096];intlen;while((len=in.read(buf))>0){out.write(buf,0,len);}//out.flush();out.close();socket.close();System.out.println("Transferência Concluída!");JOptionPane.showMessageDialog(null,"Transferência Concluída!");}catch(Exceptionex){ex.printStackTrace();}}
Alguem poderia me ajudar a resolver o problema?
Muito Obrigado!
R
rmendes08
Faltou encerrar a linha na hora de mandar o arquivo:
publicvoidenviaArquivo(Stringpath){Filef=newFile(path);try{Socketsocket=newSocket(this.getIpDoServidor(),this.getPorta());OutputStreamout=socket.getOutputStream();//File arquivo = new File("<caminho do arquivo>"); - AQUI JÁ TENHO UM FILE f QUE POSSUI O CAMINHO DO ARQUIVO InputStreamin=newFileInputStream(f);Stringnome=f.getName().trim();out.write(nome.getBytes()+"\n");// tem que colocar o \n no final para o servidor entender onde termina a linhabyte[]buf=newbyte[4096];intlen;while((len=in.read(buf))>0){out.write(buf,0,len);}//out.flush();out.close();socket.close();System.out.println("Transferência Concluída!");JOptionPane.showMessageDialog(null,"Transferência Concluída!");}catch(Exceptionex){ex.printStackTrace();}}
F
Frings
Tentei adicionar o “\n” como orientado, mas o netbeans nao aceitou colocar o “\n” em out.write().
Tentei então colocar o “\n” na linha de cima ficando assim:
Desse jeito, o arquivo é enviado e recebido no formato certo … mas por exemplo, se o arquivo for imagem, a imagem não aparece, e se o arquivo for musica, a musica nao toca. O tamanho do arquivo tanto enviado quanto recebido é o mesmo.
:S
Obrigado
F
Frings
Alguem???
R
rmendes08
Bom, o que você vai precisar fazer é estabelecer um mini-protocolo. Antes de enviar um arquivo, além do nome você pode enviar o número de bytes do arquivo. O lado que recebe deve ler o número de bytes e ler esse número exato. Dessa maneira, você não vai precisar do “\n”.
F
Frings
Valeu rmendes08, consegui resolver esta parte!
Agora, outra dúvida … quero passar o ip do cliente para o servidor armazená-lo, estou tentando usar InetAddress, com o qual eu consigo pegar o endereço ip do cliente.
Mas nao estou conseguindo fazer o envio para o servidor. Quer dizer, o envio é feito, mas no modo .toString();
Alguma sugestão??
Muito Obrigado
R
rmendes08
Não entendi, o que você quis dizer com modo toString() … de qualquer maneira, acho que você pode fazer isso do lado servidor mesmo. É até mais confiável usar o socket aberto no servidor, pois se você obter isso no cliente e enviar, é provável que você envie o IP da rede interna ao NAT.
F
Frings
Obter o endereço ip do cliente pelo lado do servidor? é isso?
Mas como faria isso?