• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

pedrotuga

[Java] Simple socket client

19 mensagens neste tópico

Depois de massacrar o pessoal na secção de java com perguntas sobre sockets, decidi pegar no código que tinha escrito fazer uma pequena aplicação. Tinha pensado numa pequena aplicação tipo um chat, mas depois lembrei-me que havia esta ideia antiga de um cliente simples para sockets.

Isto foi mais por brincadeira, eventualmente será útil numa ou noutra situação, mas há outras formas simples e criar sockets ad hoc.

Com o netbeans, por uma aplicação a rolar é uma questão de minutos.

Claro que não está polida como deve ser, mas está funcional.

socketzr4.png

podem fazer download da aplicação aqui... do código fonte ou da aplicação cmpilada.

http://www.hdd.pt/download/1330260010/src.zip.html

http://www.hdd.pt/download/1198638064/dist.zip.html

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estranho :( como é que esse request não resultou em erro, não tens o "Host: xxxx".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estranho :( como é que esse request não resultou em erro, não tens o "Host: xxxx".

Já agora aproveito para fazer um pequeno reparo à explicação que o knitter disse no outro tópico.

Um pedido GET válido precisa apenas do nome do método, do url e da discriminação da versão do protocolo HTTP. Não é preciso enviar nenhum cabeçalho para que seja um pedido válido oucompleto se lhe preferirem chamar assim.

A resposta é naturalmente enviada para o endereço que a requeriu.

O problema que eu estava a ter de não receber os headers era porque estaca a fazer pedidos não válidos, estava-me a esquecer de dizer a versão do protocolo, não era por não incluir outros cabelçalhos para alem da primeira linha.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Engraçado. :(

EDIT:

Para os que quiserem ver o miolo da aplicação mas não quiserem estar à espera no HDD.com.pt para sacar o source, aqui fica (pedrotuga, espero que não te importes):

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        
        

        try {
            
                String host = jTextField1.getText();
                int port = Integer.valueOf(jTextField2.getText()).intValue();
                
                Socket cliente = new Socket( host , port);
                
                int timeout = Integer.valueOf(jTextField3.getText()).intValue();
                
                cliente.setSoTimeout(timeout);

                PrintWriter out = new PrintWriter(cliente.getOutputStream(),true);
                BufferedReader in = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
                
                
                String pedido = jTextArea1.getText();
                out.print(pedido);
                out.flush();
                
                String line;
                String resposta = "";
                
                while((line = in.readLine())!= null){
                    resposta += line + "\n";
                }

                
                System.out.printf(resposta);
                
                jTextArea2.setText(resposta);
                
                out.close();
                in.close();
                cliente.close();
  

       
        } catch (Exception exception) {
            
            System.out.println("problemas da treta!");
        }
        

               	     
    }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por coincidência, há uns tempos atrás considerei fazer uma coisa do género em VB.net, mas depois chegaram trabalhos sem fim, e desisti da ideia. Porém, era só mesmo para recolher os cabeçalhos de HTTP e enviar pedidos POST, etc.

Tenho de experimentar mais tarde.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

triton, não me importo de todo, até gosto que o pessoal leia o meu código.

Para os cépticos, o código que o triton afixou foi todo o código que eu escrevi.Não precisei de escrever nem mais uma linha de código, até o importo dos pacotes é adicionado conforme se escreve código. O netbeans fez tudo o resto. Não é maravilhosa a tecnolgia? :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também ando a utilizar o NetBeans com Java, é mesmo muito bom! Principalmente a funcionalidade de gerar código a partir dos diagramas UML e integração automática com Subversion. Só é mesmo pena não ter undo/redo nos diagramas UML... já tive de refazer o trabalho inúmeros vezes porque eliminei coisas acidentalmente. :(

pedrotuga, as janelas também são feitas em NetBeans? Tem algum designer gráfico? Tenho de explorar mais estas tecnologias. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Yaps, eu não sou propriamente muito conhecedor de designers graficos, mas nunca vi nada tão intuitivo como o do netbeans.

A ideia disto era para experiemntar o netbeans 6 para este fim, vem com ainda mais magia que o 5.5.

Quando crias uma aplicação, esta já inclui menus editáveis, uma caixa de dialogo 'about', o quit, handlers de keybindings, persistencia do estado da aplicação entre sessões e uma carrada de outras coisa. Antes tinha que se criar tudo manualmente, apesar de ser uma questão de fazer apenas dragg and drop.

Outra coisa fixe, é que existe tambem a possibilidade de implementar uma aplicação de bases de dados cjá com CRUD, mas isso ainda não experimentei. Dese ser definir o modelo de dados e curtir :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Yaps, eu não sou propriamente muito conhecedor de designers graficos, mas nunca vi nada tão intuitivo como o do netbeans.

A ideia disto era para experiemntar o netbeans 6 para este fim, vem com ainda mais magia que o 5.5.

Não acredito que nesta altura do campeonato ainda estivesses a usar o 5.5 e ainda não usasses o 6 ou até o 6.5!

Quando crias uma aplicação, esta já inclui menus editáveis, uma caixa de dialogo 'about', o quit, handlers de keybindings, persistencia do estado da aplicação entre sessões e uma carrada de outras coisa. Antes tinha que se criar tudo manualmente, apesar de ser uma questão de fazer apenas dragg and drop.

Outra coisa fixe, é que existe tambem a possibilidade de implementar uma aplicação de bases de dados cjá com CRUD, mas isso ainda não experimentei

Uma nota, isto não é do NetBeans IDE, nem da plataforma nem está preso ao NetBeans, o que falas é uma tecnologia chamada Swing Application Framework, que está a ser introduzida no Java, e que pode ser suportada por qualquer IDE, no entanto é verdade que não conheço nenhum outro que permita isso sem ser o NetBeans IDE.

Mas essa tecnologia, tal como o binding directo de propriedades bean a outras propriedades ou bases de dados, que permite a fácil ligação de objectos Swing já existentes a bases de dados ou a outros objectos Swing, é algo que não está preso ao NetBeans IDE.

Já agora aproveito para fazer um pequeno reparo à explicação que o knitter disse no outro tópico.

Indiquei apenas um exemplo de um pedido válido, e sim, tens razão ao indicares que apenas precisas do método, url e protocolo, e naquele caso faltava-te apenas o protocolo :(. Mas por acaso quando aprendi sobre o protocolo lembro-me de me ter sido referido e de ter confirmado isso noutro lado que seria sempre bom enviar uma linha em branco no final do pedido, posso estar a fazer confusão, sabes se isso é necessário ou recomendado?

Depois de ver o código, :):

Sei que é apenas um exemplo, mas acho importante mencionar alguns pormenores para que o exemplo não sirva para ensinar menos bem. Assim, int timeout Integer.valueOf(jTextField3.getText()).intValue(); realmente faz o que pretendes, mas é como sair de Lisboa e passar pelo Porto para chegares ao Algarve, a opção mais simples será int timeout = Integer.parseInt(jTextField3.getText());, além disso seria necessário acomodar o facto de que o campo de texto pode não conter um inteiro válido. Isso podia ser feito através da excepção que o método de parse lança ou usando uma máscara no campo de texto que permita apenas entrada de números.

Este é também um excelente exemplo de como as excepções não devem ser usadas :D.

Um último ponto, estando a fazer uma aplicação gráfica, métodos que possam demorar a executar, como a comunicação por rede, nunca devem ser colocados na mesma thread de execução gráfica. Se colocarem um timeout elevado e um pedido inválido irão ver que a interface bloqueia enquanto o timeout não for atingido, o que não é desejável.

Mas está um bom exemplo e é interessante ver as dúvidas transformarem-se em algo concreto :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Yaps... eu até fiz isto para agora poder fazer uns melhoramentos, mas talvez faça outra aplicação, tipo um chat ou uma coisa assim.

Eu estou ciente desses problemas e até era a isso que me referia quando dizia que aplicação não estava polida. O uso de threads é fundamental aqui... tipo... o GUI bloqueia por completo se enfiarmos o código todo na mesma thread, enquanto está a fazer qq outra coisa, o gui pura e simplesmente não responde.

Vou aproveitar este tipo de brincadeiras para me familiarizar melhor com praticas correntes no desenvolvimento de applicações de desktop, tipo, mandar o processamento para outra thread (tenho que ler como é que isso se faz, pelo que o pessoal fala é implementar a classe runnable).

O mesmo digo se aplica por exemplo em relação a validações, não fazia ideia sequer que o tratamento de excepções era usado para esse fim. Eu faria a validação 'manualmente', mas lá está... é mais uma dica para eu aprender.

As excepções até são uma coisa que sei usar mas sinceramente não tenho grande paciencia para isso quando se trata de uma aplicação assim só por brincadeira.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando estamos a fazer pequenos testes nem é tão importante, só mencionei porque este pequeno teste tornou-se público :(

As excepções servem para tratamento de erros, podes usar a excepção especifica que o método parseInt te lança, mas a opção mais correcta é precaver o erro, daí, usar uma máscara. Mas qualquer uma das duas opções é bastante usada. Pessoalmente sou mais apologista de usar a máscara mas dependerá do objectivo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

vou aqui curtir mais um bocado,

estive a ler uns tutoriais e uns exemplos e usar threads parece-me relativamente simples.

Já agora aproveito e faço tembm umas validações e afins.

Knitter, não estou a perceber muito bem o uso de máscaras... os textfields 'formatados' são um objecto diferente  ou é o facto de se usar uma máscara de validação que lhes confere a classificação de 'formatados'?

podes dar aí um pequeno exemplo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não queria ser chato, mas acho que isto faz mais sentido no armazém de código... E se é mesmo projecto, podias pôr o post inicial como ditam as regras :)

Estranho :P como é que esse request não resultou em erro, não tens o "Host: xxxx".

Não resultou em erro porque a versão 1.0 do protocolo não requer o envio do header Host. :)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(...) os textfields 'formatados' são um objecto diferente  ou é o facto de se usar uma máscara de validação que lhes confere a classificação de 'formatados'?

Existe mesmo um componente para esse efeito, o JFormattedField, que te permite definir uma máscara, e que define o tipo de dados que são aceites.

Como em qualquer situação há imensas formas de fazer isso, usar o componente é o mais rápido, sendo que precisas só perceber como funciona o sistema de máscaras, o Netbeans tem um wizard para isso, é só carregar no campo da máscara. Outra forma, usando um JTextField seria controlar os dados que são introduzidos no document, através de um document listener. Poderias ainda introduzir um input verifier no JTextField que iria actuar na altura em que o componente estiver a perder focus.

podes dar aí um pequeno exemplo?

Se controlares a construção do JFormattedField podes usar o seguinte código para permitir números: new JFormattedTextField(NumberFormat.getNumberInstance());

No NetBeans IDE, para seres tu a constrolar a criação do componente, tens de preencher o compo "Custom Creation Code", a que podes aceder no painel de propriedades sob o separador "Code".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tentei pegar o código fonte:

http://www.hdd.pt/download/1330260010/src.zip.html

http://www.hdd.pt/download/1198638064/dist.zip.html

Mas não está disponível

Tentei seguir o código postado pelo TRITON mas dá erro no WHILE:

while((line = in.readLine()) != null){
				resposta += line + "\n";
}

se não deixar esse WHILE comentado, informa erro e salta para EXCEPTION

alguém pode ajudar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora