Você está na página 1de 6

Sockets

Introduo

Para estabelecer a Comunicao entre processos nos Sistemas Distribudos e permitir que
processos se comuniquem na troca de dados ou acessos a recursos ou servios em processadores
remotos ou locais, se faz necessrio o uso de um mecanismo de servios de transporte. Um dos
mecanismos mais utilizado o Sockets como sendo uma maneira mais popular de utilizar as
funcionalidades de comunicao TCP/IP gerenciados pela camada de transporte.

Definio
Um Socket um ponto final (endpoint) de um canal bidirecional de comunicao entre dois
programas rodando em uma rede, ou seja, pode ser entendido como uma porta de um canal de
comunicao que permite a um processo executando em um computador enviar ou receber
mensagens para ou de outro processo que pode estar sendo executado no mesmo computador ou
num computador remoto.

Sockets e Portas de comunicao


Para que efectivamente ocorra a comunicao entre mquinas mediante a pilha de protocolos o
endereo IP fundamental, porm outros dois factores so essenciais e precisam ser definidos: o
protocolo de transporte e a porta de comunicao. A esta trade chamamos de socket, cuja funo
identificar univocamente uma aplicao na rede. O sistema operacional associa o socket a um
ou mais processos existentes na memria e o utiliza como canal para envio e recebimento dos
dados relacionados pela rede.

Conexo
Na comunicao orientada a conexo, uma aplicao servidora disponibiliza um canal ao qual
aplicaes clientes se conectaro para trocarem dados. Uma aplicao servidora pode ter
conexes com vrios clientes. Inicialmente, o servidor cria um socket que no ser usado para
troca de mensagens, mas somente para as aplicaes clientes poderem se conectar. Para cada
cliente que se conecta, automaticamente criado um novo socket para o recebimento e envio de
mensagens com o cliente recm conectado.

Funcionamento:
O servidor apenas fica ouvindo o Socket aguardando um pedido de conexo do cliente;
O cliente sabe o nome do host e qual porta est associada aplicao servidora;
Assim que o servidor aceitar a conexo, este cria um novo Socket (e consequentemente o associa
a uma nova porta) e pode ficar esperando novas conexes no Socket original enquanto atende s
requisies do cliente pelo novo Socket.

Comunicao Cliente - Servidor


Programas baseados em sockets so geralmente aplicaes cliente-servidor. O servidor espera
pedidos de seus clientes, os processa e retorna os resultados ao cliente. O cliente estabelece uma
conexo com o servidor, conectando-se a uma porta do servidor na mquina onde o servidor est
sendo executado. preciso saber qual o nmero da porta de uma aplicao antes de se iniciar um
processo de conexo.

Servidor:

Efectua a criao de um Socket;

Associa o Socket a um endereo local;

Aguarda por conexes da parte cliente;

Aceita conexes;

L requisies;

Opcionalmente envia resposta;

Fecha o Socket.

Cliente:

Efectua a criao do Socket;

Estabelece a conexo;

Envia a requisio;

Opcionalmente aguarda resposta;

Fecha o Socket

Programando Java com Sockets.


Crie um directrio no seu computador, onde ira alojar todos ficheiros java (*.java)

Programa Cliente.
Crie um ficheiro com o nome Cliente.java e adicione o cdigo abaixo.
import java.net.*;
import java.io.*;

public class Cliente


{ public static void main(String args[] )
{
String sumString = "";
System.out.println("Abrindo o socket e criando o stream.");
String host = "localhost"; //args[0];
Socket socket = new Socket (host, 250);

DataOutputStream ostream = new DataOutputStream(socket.getOutputStream());


DataInputStream istream = new DataInputStream(socket.getInputStream());

System.out.println("inicializando sum 0.");


ostream.writeUTF("set_sum");
ostream.flush();
sumString = istream.readUTF();

System.out.println("Incrementando.");
int count = new Integer("10").intValue();
long startTime = System.currentTimeMillis();

for (int i = 0; i < count; i++)


{
ostream.writeUTF("incrementando");
ostream.flush();
sumString = istream.readUTF();

long stopTime = System.currentTimeMillis();


System.out.println ("AVG ping = " + ((stopTime - startTime) / (float)count) + "msecs") ;
System.out.println("Contador = " + sumString);
}
catch(Exception e)
{ System.err.println(e);
}
}
}

Aps efectuar a gravao do contedo no ficheiro, volte a criar outro ficheiro nomeando
Servidor.java e adiciona o seguinte contedo.
import java.net.*;
import java.io.*;

public class Server {


public static void main ( String[] args )
{
Socket socket = null;
int sum = 0;
String sumString = "" ;

while (true)
{ try
{
ServerSocket serverSocket = new ServerSocket(250);

System.out.println("Aguardando um conexo cliente");


socket = serverSocket.accept();
DataOutputStream ostream = new DataOutputStream(socket.getOutputStream());
DataInputStream istream = new DataInputStream(socket.getInputStream());

while(true)
{ String myOperation = istream.readUTF();
if (myOperation.equals("Incrementando"))
sumString = String.valueOf (++sum);
else
if (myOperation.equals("set_sum"))
{
sum = 0;
sumString = String.valueOf(sum);
System.out.println("Contador = " + sumString );
}
ostream.writeUTF(sumString);
ostream.flush();
}}

catch (Exception e)
{ System.err.println("Fechando conexo") ;
if (socket != null)
try
{ socket.close();
} catch (IOException ex) {}
}
}
}
}
Grava o ficheiro e certifique se os ficheiros esto devidamente alocados no directrio criado.
Abra a duas consolas (cmd Windows ou Terminal- Linux) e direccione ao directrio onde
foram alocados os ficheiros java. Efectue a compilao dos mesmos usando o comando javac
<NomeDoFicheiro>.java, Caso a compilao for com sucesso execute primeiro o ficheiro
Servidor.java em uma consola com a instruo java Servidor e de seguida o Cliente.java em
uma outra consola usando java Cliente, aps isso apresentara o resultados.