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.
Vamos construir um sistema bem simples, baseado em troca de mensagens no estilo “ping-pong".
Para isso, as seguintes ferramentas são necessárias:
- Servidor Linux com Node.js instalado (apt-get install nodejs)
- Ambiente de desenvolvimento com Java (Eclipse IDE)
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);
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;
}
}
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;
}
Agora, na Figura 1 temos o printscreen do console do Eclipse. Ao rodar o client java nesse IDE, você deverá obter uma tela semelhante.
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.