Cada vez mais é maior a interação entre o usuário e a web, através dos mais diversos meios, como jogos online, blogs, chats, interações em redes sociais, etc. Toda essa demanda, requer que a comunicação entre os aplicativos, client e server, ser tornem cada vez mais velozes, atendendo um grande número de usuário simultâneos de forma eficiente.

As atuais tecnologias que permitem “real-time” incluem: Node.js, banco de dados noSQL (mongodb), Socket.IO, entre outras.

Neste artigo vamos construir uma simples aplicação de comunicação real-time, usando java no client e nodejs no lado servidor. Com a ajuda deste artigo você poderá construir aplicativos Java (desktop, mobile, etc.) se comunicando com tecnologias real-time.

Nota: Conheça os Treinamentos Completos de Java da DevMedia.

Vamos construir um sistema bem simples, baseado em troca de mensagens no estilo “ping-pong".

Para isso, as seguintes ferramentas são necessárias:

Este artigo fornece os códigos para que você possa montar um pequeno mecanismo de comunicação real-time com Java e node.js. A partir destes exemplos funcionais, você poderá avançar, incrementando de acordo com sua necessidade.

Na Listagem 1 temos o código do servidor com Nodejs.


  var net = require('net');
   
  var HOST = '127.0.0.1'; // parametrizar o IP do Listen
  var PORT = 6969; // porta TCP LISTEN
   
  // Cria a instância do Server e aguarda uma conexão
  net.createServer(function(sock) {
   
      // Opa, recebemos uma conexão - um objeto socket é associado à conexão automaticamente
      console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);
   
      // Adiciona um 'data' - "event handler" nesta instância do socket
      sock.on('data', function(data) {
          // dados foram recebidos no socket 
          // Escreve a mensagem recebida de volta para o socket (echo)
          sock.write(data);
      });
   
      // Adiciona um 'close' - "event handler" nesta instância do socket
      sock.on('close', function(data) {
          // conexão fechada
          console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
      });
   
  }).listen(PORT, HOST);
   
  console.log('Server listening on ' + HOST +':'+ PORT);
Listagem 1. Código fonte do servidor usando nodejs

Temos alguns pontos importantes a observar no código acima: logo no início do script, parametrize o IP e Porta onde o servidor nodejs irá fazer o Listen. Altere o 127.0.0.1 para o ip real (válido) do seu servidor, conforme abaixo:


  var HOST = '127.0.0.1'; // parametrizar o IP do Listen
  var PORT = 6969; // porta TCP LISTEN

Veja abaixo a função que é disparada quando chega uma nova conexão, simplesmente faz um echo de volta para o programa client:


  // Adiciona um 'data' - "event handler" nesta instância do socket
  sock.on('data', function(data) {
  // Escreve a mensagem recebida de volta para o socket (echo)
              sock.write(data);
  });

Na Listagem 2 temos o código client em Java, que abre uma conexão socket com o servidor, envia uma mensagem qualquer e a recebe de volta, imprimindo-a na tela.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
 
/**
 * Classe Java (client) para Comunicação com servidor NodeJS
 * Escreve e recebe um simples "echo" -> "mensagem123"
 * by Douglas.Pasqua
 * http://douglaspasqua.com
 */
public class NodeJsEcho {
  // objeto socket
  private Socket socket = null;

  public static void main(String[] args) throws UnknownHostException, 
  IOException, ClassNotFoundException {
    // instancia classe
    NodeJsEcho client = new NodeJsEcho();

    // conexão socket tcp
    String ip = "1.1.1.1";
    int port = 6969;
    client.socketConnect(ip, port);

    // escreve e recebe mensagem 
    String message = "mensagem123";

    System.out.println("Enviando: " + message);
    String retorno = client.echo(message);
    System.out.println("Recebendo: " + retorno);
  }

  // realiza a conexão com o socket
  private void socketConnect(String ip, int port) throws UnknownHostException, IOException {
    System.out.println("[Conectando socket...]");
    this.socket = new Socket(ip, port);
  }           
              
  // escreve e recebe mensagem full no socket (String)
  public String echo(String message) {
    try {
      // out & in 
      PrintWriter out = new PrintWriter(getSocket().getOutputStream(), true);
      BufferedReader in = new BufferedReader
      (new InputStreamReader(getSocket().getInputStream()));

      // escreve str no socket e lêr
      out.println(message);
      String retorno = in.readLine();
      return retorno;
               
      } catch (IOException e) {
      e.printStackTrace();
    }
              
    return null;    
  }

  // obtem instância do socket
  private Socket getSocket() {
              return socket;
  }
}
Listagem 2. Código fonte do client java

Lembre-se da parametrização do IP e Porta onde o client em java irá se conectar com o servidor nodejs. Altere o ip 1.1.1.1 para o IP válido onde esta hospedado o aplicativo nodejs, conforme o código abaixo:


  // instancia classe
  NodeJsEcho client = new NodeJsEcho();
                          
  // conexão socket tcp
  String ip = "1.1.1.1";
  int port = 6969;
  client.socketConnect(ip, port);

Na Listagem 3 damos destaque ao método que escreve e recebe a mensagem no socket (nodejs).


// escreve e recebe mensagem full no socket (String)
public String echo(String message) {
  try {
    // out & in 
    PrintWriter out = new PrintWriter(getSocket().getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader(getSocket().getInputStream()));

    // escreve str no socket e lêr
    out.println(message);
    String retorno = in.readLine();
    return retorno;
             
  } catch (IOException e) {
    e.printStackTrace();
  }
  
  return null;
}
Listagem 3. Envio e recebimento de mensagens

Agora, na Figura 1 temos o printscreen do console do Eclipse. Ao rodar o client java nesse IDE, você deverá obter uma tela semelhante.

Resultado
da compilação
Figura 1. Resultado da compilação

Agora basta evoluir este simples aplicativo para sua necessidade. Espero que tenha aproveitado. Boa sorte!


Saiu na DevMedia!

  • Programe com o Node.js:
    Nesta série conversamos sobre qual é o propósito do Node.js e o que o torna diferente de outras tecnologias.

Saiba mais sobre Node.js ;)

  • Principais conceitos da plataforma Node.js:
    Nesta publicação serão descritos os principais conceitos da plataforma Node.js, sua aplicabilidade e um breve tutorial para elaboração de um aplicativo de micro blog.