Redes – Sabe o que são sockets de comunicação? (Parte II)
Aprenda a programar uma aplicação servidor em Java
Quem gosta de tecnologia, certamente já se questionou como determinados sistemas funcionam e comunicam. Hoje em dia, graças a adopção, como strandard, do protocolo IP, os dispositivos conseguem facilmente “comunicar” entre eles de uma forma totalmente transparente para o utilizador.
Mas como é que uma aplicação cliente consegue, por exemplo, comunicar com uma aplicação servidor e vice-versa?
Depois de termos apresentado um artigo sobre sockets e como funcionam (ver aqui), hoje vamos aprender a programar, em Java, uma aplicação servidor, usando sockets.
Actualmente existem algumas tecnologias que permitem a comunicação entre máquinas. Uma das tecnologias/mecanismos mais comuns para comunicação entre máquinas é os sockets. Socket é um mecanismo de comunicação, usado normalmente para implementar um modelo cliente/servidor, que permite a troca de mensagens entre os processos de uma máquina/aplicação servidor e de uma máquina/aplicação cliente.
Programar uma aplicação servidor não é difícil e podemos aproveitar muito do código partilhado (gentilmente) por muitos programadores. A aplicação servidor que proponho, foi desenvolvida em Java e nesse sentido o utilizador (para este tutorial) apenas necessita de ter o Java instalado e um editor de texto.
Para começar, vamos criar um ficheiro com o nome SocketServer.java e adicionar o seguinte código
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class SocketServer { public static void main(String[] args){ ServerSocket serverSocket = null; Socket socket = null; DataInputStream dataInputStream = null; DataOutputStream dataOutputStream = null; try { serverSocket = new ServerSocket(50000); System.out.println("Socket Servidor Pplware"); System.out.println("A escuta no porto: 50000"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } while(true){ try { socket = serverSocket.accept(); dataInputStream = new DataInputStream(socket.getInputStream()); dataOutputStream = new DataOutputStream(socket.getOutputStream()); System.out.println("IP Cliente: " + socket.getInetAddress()); dataOutputStream.writeUTF("Ola: !"+ socket.getInetAddress()); dataOutputStream.writeUTF(""+socket.getLocalPort()); System.out.println("Mensagem: " + dataInputStream.readUTF()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ if( socket!= null){ try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if( dataInputStream!= null){ try { dataInputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if( dataOutputStream!= null){ try { dataOutputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } |
Depois deve gravar (no meu caso gravei na partição D:)
Em seguida devem ir linha de comandos do Windows (Iniciar > executar e escrever cmd), posicionarmos-nos na pasta onde temos o ficheiro com a classe criada anteriormente e vamos proceder à compilação da mesma usando o comando:
javac SocketServer.java |
O ficheiro compilado é designado de ByteCode, passando este a ser interpretado pela Java Virtual Machine…e em seguida colocamos a aplicação servidor a correr usando o comando
java SocketServer |
Para testarem se tudo está a funcionar, podem por exemplo fazer um telnet para o porto que está agora a espera de ligações. Para isso, basta que executem o seguinte comando:
telnet localhost 50000 |
Num próximo tutorial iremos proceder a configuração da aplicação cliente. Caso pretendam algum esclarecimento relativamente ao código disponibilidade, deixem esse pedido nos comentários. Na prática, a aplicação servidor implementa um ciclo while infinito, possibilitando desta forma que o servidor esteja sempre a espera de ligações. Por cada cliente que se ligue, é criado um socket e os streams de comunicação (de output e input).
Este artigo tem mais de um ano
[…] comunicação entre máquinas SÃO os sockets.
😉
Já estudei os sockets mas em vez de Java trabalhei com Linux POSIX.
E quantas dores de cabeça tiveste? 😀 (just kidding)
lol Eu curti muito esses esclarecimentos sobre sockets e redes, gostei de como explicaram os fundamentos, belissimo.
Esse código java seria de grande ajuda semestre passado quando eu estava a precisar de uma ajuda, eu sofri mais achei um meio de fazer
Sugestão:
tenta indentar o código quando fazes um artigo deste género, torna mais fácil a leitura do código.
E nao é que nao consigo colocar essa coisa a funcionar :S
E que tal uma EXTRA ajuda xD
Só com essa descrição é meio complicado.
Que parte não funciona ?
Ora então o java esta instalado no sistema operativo MS 7 profissional.
e quando tento compilar “javac SocketServer.java”
nao consigo :_S
ou tenho que colocar o ficheiro num sitio especifico ,ou, nao entendo
No NetBeans faça Debug File…na janela de Output vai-lhe aparecer o resultado!
bom artigo!
Fiz um aplicação assim em php. Só que nunca consegui meter vários clientes na mesma porta. (acho que em php não dá)… Esta script permite isso? pareceu-me que não.
Gostaria de saber o métedo para ‘meter’ vários clientes na mesma porta.
Os conhecimentos que tenho em sockets não vão muito alem de falar com o servidor e ele responder a perguntas já definidas….
Ao tentar escrever javac SocketServer.java no cmd diz que o comando não é reconhecido como um comando interno ou externo,programa operacional ou ficheiro bacth. Alguma ideia do porquê de isto acontecer??
Obrigado.
Bom dia Helio, Tens o Java instalado?
Cola aqui qual o resultado do comando path na linha de comandos.
Só para não ter que passar tudo xD
Obrigado
http://imageshack.us/photo/my-images/221/javac.jpg/
http://imageshack.us/photo/my-images/542/patho.jpg/
Estou entretanto a reinstalar o java para ver se resolve…
Já reinstalei tudo e não dá na mesma…
Também achava estranho porque tenho desenvolvido alguma aplicações para android e sem problemas.
O resultado do PATH:
http://imageshack.us/photo/my-images/542/patho.jpg/
Boas Helio,
É mesmo problema no path, daí ele nao conhecer o comando Java e Javac. Tens a certeza que tens mesmo instalado o Java?
Acha que falta algum??
http://imageshack.us/photo/my-images/36/javatw.jpg/
Como posso verificar isso?
Boas, para quando a configuração da aplicação cliente?
Cumprimentos