Redes – Sabe o que são sockets de comunicação? (Parte II)

19 Comentários

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.

sockets_00

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:)

java_00

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

java_01

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

java_02

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).

Partilhar:
Tags:

Comentários

19

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Ricardo Azevedo
    Ricardo Azevedo

    […] comunicação entre máquinas SÃO os sockets.

    😉

    Já estudei os sockets mas em vez de Java trabalhei com Linux POSIX.

    1. Avatar de Emanuel Alves
      Emanuel Alves

      E quantas dores de cabeça tiveste? 😀 (just kidding)

  2. Avatar de Gabriel Queiroz

    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

  3. Avatar de Bruno Gonçalves
    Bruno Gonçalves

    Sugestão:
    tenta indentar o código quando fazes um artigo deste género, torna mais fácil a leitura do código.

  4. Avatar de Luis Ribeiro
    Luis Ribeiro

    E nao é que nao consigo colocar essa coisa a funcionar :S

    E que tal uma EXTRA ajuda xD

    1. Avatar de Viperz0r

      Só com essa descrição é meio complicado.
      Que parte não funciona ?

      1. Avatar de Luis Ribeiro
        Luis Ribeiro

        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

        1. Avatar de Vitor Oliveira
          Vitor Oliveira

          No NetBeans faça Debug File…na janela de Output vai-lhe aparecer o resultado!

  5. Avatar de Luiz
  6. Avatar de Carlos Santos
    Carlos Santos

    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….

  7. Avatar de Hélder Ribeiro
    Hélder Ribeiro

    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.

    1. Avatar de Pedro Pinto

      Bom dia Helio, Tens o Java instalado?
      Cola aqui qual o resultado do comando path na linha de comandos.

      1. Avatar de Hélder Ribeiro
        Hélder Ribeiro

        Só para não ter que passar tudo xD
        Obrigado
        http://imageshack.us/photo/my-images/221/javac.jpg/

          1. Avatar de Hélder Ribeiro
            Hélder Ribeiro

            Estou entretanto a reinstalar o java para ver se resolve…

      2. Avatar de Hélder Ribeiro
        Hélder Ribeiro

        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/

        1. Avatar de Pedro Pinto

          Boas Helio,
          É mesmo problema no path, daí ele nao conhecer o comando Java e Javac. Tens a certeza que tens mesmo instalado o Java?

          1. Avatar de Hélder Ribeiro
            Hélder Ribeiro

            Acha que falta algum??
            http://imageshack.us/photo/my-images/36/javatw.jpg/
            Como posso verificar isso?

  8. Avatar de Marco
    Marco

    Boas, para quando a configuração da aplicação cliente?
    Cumprimentos