Socket em Java
Servidor
import java.io.*;
import java.net.*;
public class Servidor
{
public static void main( String args[] ) throws Exception
{
//Escutar a porta 6789
ServerSocket server = new ServerSocket( 6789 );
//Espera uma conexão
Socket cliente = server.accept();
// -------------------------- // RECEBE UM DADO DO CLIENTE
InputStream input = cliente.getInputStream();
int valor = input.read();
// Mostrar o valor na tela
System.out.println( "valor: " + valor );
//Fechar a conexão
input.close();
cliente.close();
server.close();
}
}
Limitação: ele recebe apenas 1 cliente e depois
para a conexão;
Cliente
import java.io.*;
import java.net.*;
public class Cliente
{
public static void main( String args[] ) throws Exception
{
//Abrir a conexao com o servidor
Socket socket = new Socket( "127.0.0.1" , 6789 );
// -------------------------- // ENVIAR UM DADO
OutputStream output = socket.getOutputStream();
output.write( 127 );
//Fechar a conexão com o servidor
output.close();
socket.close();
}
}
1° melhoramento
servidor pode receber mais clientes
Servidor
public class Servidor{
Private static boolean executar = true;
public static void main( String args[] ) throws Exception{
//Escutar a porta 6789
ServerSocket server = new ServerSocket( 6789 );
while( executar ){
//Espera uma conexão
Socket cliente = server.accept();
// -------------------------- // RECEBE UM DADO DO CLIENTE
InputStream input = cliente.getInputStream();
int valor = input.read();
//Mostrar o valor na tela
System.out.println( "valor: " + valor );
//Fechar a conexão
input.close();
cliente.close();
}
server.close();
}
}
Limitação: ele recebe apenas 1 cliente por vez;
2° melhoramento
servidor pode atender clientes simultaneamente
Servidor
import java.net.*;
import java.util.concurrent.*;
public class Servidor{
Private static boolean executar = true;
public static void main( String args[] ) throws Exception{
//Escutar a porta 6789
ServerSocket server = new ServerSocket( 6789 );
ExecutorService pool = Executors.newCachedThreadPool();
while( executar ){
//Espera uma conexão
Socket cliente = server.accept();
//Atender o cliente em um Thread
pool.submit( new AtenderClienteRunnable( cliente ) );
}
server.close();
}
}
Servidor
( continuação... )
import java.io.InputStream;
import java.net.Socket;
public class AtenderClienteRunnable implements Runnable
{
private Socket cliente;
public AtenderClienteRunnable(Socket cliente) {
this.cliente = cliente;
}
@Override
public void run() {
Try {
// -------------------------- // RECEBE UM DADO DO CLIENTE
InputStream input = cliente.getInputStream();
int valor = input.read();
// Mostrar o valor na tela
System.out.println( "valor: " + valor );
//Fechar a conexao com o cliente
input.close();
cliente.close();
}
catch(Exception err) { err.printStackTrace(); }
}
}
3° melhoramento
Facilidades do Java
Facilidades

Utilizar o OutputStream e o InputStream é a
maneira mais baixo nível de comunicação;



Enviar e receber bytes;
O java permite enviar e receber um objeto, de
forma fácil e rápida;
Basta criar uma instancia do
ObjectOuputStream e ObjectInputStream;
Servidor
@Override
public void run() {
Try {
// -------------------------- // RECEBE UM DADO DO CLIENTE
InputStream input = cliente.getInputStream();
ObjectInputStream ois = new ObjectInputStream( input );
Protocolo protocolo = (Protocolo) ois.readObject();
// Mostrar o valor na tela
System.out.println( protocolo.toString() );
System.out.println( "------------------" );
//Fechar a conexao com o cliente
input.close();
cliente.close();
}
catch(Exception err) { err.printStackTrace(); }
}
Cliente
public class ClienteObjeto
{
public static void main( String args[] ) throws Exception
{
//Abrir a conexao com o servidor
Socket socket = new Socket( "127.0.0.1" , 6789 );
// -------------------------- // ENVIAR UM DADO
OutputStream output = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream( output );
Protocolo protocolo = new Protocolo();
protocolo.setId( 1 );
protocolo.setMetodo( "somar" );
protocolo.setParam1( 10 );
protocolo.setParam2( 20 );
oos.writeObject( protocolo );
//Fechar a conexao com o servidor
output.close();
socket.close();
}
}
… onde eu quero chegar com isso: o cliente
apenas envia e o servidor apenas recebe.
Deste modo, o exercício de vocês é fazer com o
que o cliente espere e mostre na tela a resposta
do servidor.
Exercício

objetivo: Validar um CPF ou CNPJ no servidor

O cliente envia um CPF ou CNPJ para o servidor

O servidor recebe o dado, processa e retorna uma resposta




true: caso o CPF ou CNPJ seja válido

False: caso o CPF ou CNPJ seja inválido
O cliente deve mostrar a resposta na tela
O Servidor deve:

Receber vários clientes (use while logo após abrir a porta);

de forma simultânea (use Thread);
Se tiver código igual, nenhum dos grupos irá receber a nota;
Exercício

Adicionar ou modificar um objeto usuário no servidor

O cliente envia o objeto usuário e qual ação deve fazer

O servidor processa e retorna:


true: caso tenha feito com sucesso

False: caso acontecer alguma falha
O cliente deve esperar e imprimir na tela a resposta do servidor
Avisos
• Em trio!
• Devem enviar por e-mail ([email protected]) o
trabalho no dia 13/04;
• Vale 3 pontos;
• Não receberam pontos caso haja 2 ou mais
trabalhos iguais;
Download

socket.close()