Vous êtes sur la page 1sur 9

Comunicao por sockets

1.Introduo

A comunicao entre mquinas fundamental na integrao de sistemas, como em:


Mquinas de comando numrico recebendo programas de sistemas CAD ou enviando o status da produo a
sistemas supervisrios (SCADA Supervisory Control and Data Acquisition, MES-Manufacturing Execution
Systems)
Integrao entre empresas, com o uso de sistemas de intercmbio eletrnico de dado (EDI-Electronic Data
Interchange)
Toda a Internet e suas diversas aplicaes de integrao de empresas (e-procurement)
Aplicativos em arquitetura client-server, como os sistemas ERP-Enterprise Resource Planning
Novos automveis, como o Citroen e seus 11 processadores embarcados (embedded systems)

E muitas outras.

As formas desta comunicao variam muito, desde o uso de interfaces seriais RS232, de rede Ethernet, wireless, etc.

Assim como no mundo dos humanos, a comunicao entre mquinas governada por um protocolo. Um protocolo
uma coleo de acordos, que devem ser observados por todos os envolvidos na comunicao. Veja por exemplo o
que acontece em uma sala de aula: quando um aluno deseja perguntar algo, levanta a mo, solicitando acesso ao
meio fsico, o ar, e a permisso para falar (token). Ao terminar, o token retorna ao professor. De uma forma
simples, um protocolo de comunicao envolve dois tipos de protocolos:
Protocolo fsico, envolvendo a definicao do meio fsico (ar, cabo em par tranado, fibra tica), a sinalizao
(presso acstica, nvel de tenso, intensidade luminosa), a codificao do sinal (banda base, tipo de
modulao), conectores, etc. No caso dos humanos, definiu-se (pelo menos, por enquanto...) que o protocolo
fsico utilizaria o ar como meio fsico, com a sinalizao em banda base utilizando presso acstica. Um dia,
que sabe, estaremos usando ondas telepticas...
Protocolo lgico, envolvendo a definio das mensagens que fluiro entre os participantes da comunicao.
Deve-se ter um acordo sobre o lxico, sinttico e semntico. Por exemplo, no adianta voc falar em Francs
quando seu interlocutor somente compreende Portugus; em outras palavras, apesar do lxico ser o mesmo, o
sinttico e o semntico so diferentes.

Assim, no basta dizer que os sistemas se comunicam atravs da interface serial RS232, como comumente se
escuta. necessrio que o protocolo lgico tambm seja compreendido entre ambas as partes, para que a
comunicao realmente acontea.

2.A pilha TCP-IP

2.1.O Modelo OSI-ISO

O modelo OSI-ISO (Open Systems Interconnection, produzido pela ISO-International Standards Organization)
utilizado como referncia para o projeto e a anlise de protocolos de comunicao. Sua principal caracterstica
dividir as funcionalidades (que ele chama servios) necessrias comunicao em camadas, dividindo assim as
responsabilidades e permitindo que uma certa camada possa ter diferentes implementaes (com diferentes
tecnologias ou fornecedores), mas ainda assim tendo-se a sua compatibilidade.

As setes camadas os servios a serem prestados esto resumidos a seguir:


Fig.1. Modelo OSI-ISO

onde:

Camada Servios
Fsica(1) Transmisso de sequncias de bits sobre meio fsico
Especifica : sinalizao, codificao, conectores e pinagens,
meio fsico, aspectos eletrnicos e mecnicos
Domnio da engenharia eletrnica
No trata de correo de erros na transmisso

Enlace(2) Organiza sequncias de bits em conjuntos de bits chamados


frames
Reconhece incio e fim de frames
Detecta perdas de frames e requisita retransmisso

Rede(3) Encaminha informao da origem para o destino (roteamento)


Controla fluxo de transmisso entre sub-redes (controle de
congesto)
Funes de contabilizao
Estabelece esquema nico de endereamento independente da
sub-rede utilizada
Permite conexo de sub-redes heterogneas

Transporte(4) Divide e reagrupa a informao binria em pacotes


Garante a sequncia dos pacotes
Assegura a conexo confivel entre origem e destino da
comunicao
Primeira camada que estabelece comunicao origem-destino

Sesso (5) Gerencia sesses de comunicao


Sesso uma comunicao que necessita armazenar estados
Estados so armazenados para permitir re-estabelecimento da
comunicao em caso de queda da comunicao
Ex: Retomar transferncias de arquivos

Apresentao(6) Trata da representao dos dados em alto nvel


Adoo de sistema padronizado de representao de caracteres
Adoo de cdigos de representao numrica padro
Compresso de dados
Codificao de dados
Aplicao (7) Aplicaes que oferecem os servios ao usurio final
Unificao de sistemas de arquivos e diretrios
Correio eletrnico
Login remoto
Transferncia de arquivos
Execuo remota

2.2.O protocolo TCP-IP

O protocolo TCP-IP foi criado nos anos 70, por encomenda do Departamento de Defesa dos Estados Unidos
(ARPA), com o objetivo militar de criao de uma rede em que no fosse necessrio um ponto central de
coordenao, j que este poderia ser atacado em caso de guerra e destrudo todo o sistema de comunicao.
Implementa de forma parcial o modelo OSI-ISO, como mostra a figura:

fig.2. Modelo OSI-ISO e TCP/IP

Pela figura, pode-se perceber que os nveis 1 e 2, responsveis pelo acesso ao meio fsico, podem ser implementados
de vrias formas. Por exemplo, em sua casa, se voc utiliza a acesso discado Internet, tem a linha telefnica como
nivel 1 e o protocolo PPP (Point-To-Point Protocol) como nvel 2.

No nvel IP, cada computador conectado rede mundial possui um endereo nico, denominado endereo IP. Este
formado por 4 bytes (valores de 0 a 255), como 143.107.106.20 e que corresponde a um nome nico (no caso,
www.poli.usp.br).

O endereamento IP hierrquico, tendo-se as seguintes classes de endereamento:

A:0.X.X.X a 127.X.X.X, 128 redes de 16 milhes de computadores


B:128.X.X.X a 191.X.X.X, 16 mil redes de 65 mil computadores
C: 191.X.X.X a 223.X.X.X, 2 milhes de redes de 256 computadores

Duas implementaes esto disponveis no nivel de transporte (nivel 4): os protocolos TCP (Transport Control
Protocol) e UDP (User Datagram Protocol). As principais caractersticas destes protocolos esto listadas a seguir:

Protocolo Caractersticas
UDP Oferece servios de entrega de datagramas (pacotes)
No cuida do sequenciamento de pacotes
Estaria entre a camada 3 e 4, pois no implementa sequenciamento
de pacotes
No implementa checagem e correo de erros (no confivel)
Utilizado eficientemente em redes locais, que j possuem mecanismos
de checagem de erros em nvel mais baixo

TCP Oferece servios de transmisso de streams


Fragmenta os streams em pacotes e os entrega a camada IP
Protocolo confivel com checagem de erros
Implementa camada 4
Mais complexo e mais lento que UDP
3.Sockets

O modelo OSI-ISO no define precisamente as interfaces entre as camadas, mas apenas os servios a serem
prestados por cada uma. A interface entre a camada de Aplicao e a de Transporte foi definida, de forma
independente, pela Universidade da Califrnia em Berkeley, que projetou a interface chamada Sockets e pela AT&T,
que definiu o padro TLI (Transport Layer Interface). A indstria adotou Sockets como padro de fato.

3.1.Computao client-server

Na computao client-server, tem-se um processo Client (cliente) que requisita um servio (ou funcionalidade)
oferecido pelo processo Server (servidor). Client e Server podem estar no mesmo computador ou em computadores
distintos. Assim, por exemplo, quando o seu navegador de Internet (browser) requisita uma pgina
(http://www.poli.usp.br/mecatronica.html) est fazendo o papel de Client e o webserver, de Server. O servio
envolvido , justamente, o fornecimento da pgina web.

3.2.A interface Sockets

Um socket um ponto de conexo entre a camada de Aplicao e a de Transporte (TCP ou UDP). Neste texto,
apenas a interface TCP ser discutida, por sua mais larga aplicabilidade.

Do lado Server, definiu-se que a camada TCP teria 216 1 pontos de conexo, permitindo portanto que at cerca de
32000 diferentes Aplicaes possam ser implementadas na mesma mquina. Este ponto de conexo denominado
port (em Portugus, usa-se port ou porta). Cada Aplicao escuta[1] um socket, esperando por uma conexo e as
requisies dos diversos Clients. Uma mesma Aplicao pode ter, dependendo de como implementada, muitos
Clients simultaneamente.

J o Client, para iniciar uma comunicao com o Server, deve inicialmente abrir uma conexo (lembre-se que o
protocolo TCP orientado a conexo) e, a partir da, pode enviar mltiplas requisies ao Server e deste, receber
respostas. Enquanto a conexo estiver ativa, tem-se uma comunicao bi-direcional entre Client e Server.

3.3.Sockets em Java

A linguagem Java possui uma bibliteca de funes no pacote java.net, voltada comunicao por sockets.

As principais classes envolvidas e seus mais importantes mtodos so:

java.net.ServerSocket representa a viso da comunicao do lado Server. Os seus principais mtodos so:

ServerSocket(int port) throws IOException


Construtor. Recebe como parmetro a porta a ser escutada pelo Server

accept() : Socket throws IOException


mtodo que espera que uma conexo seja estabelecida. Retorna uma instncia da classe Socket (ver a seguir) que
encapsula a comunicao propriamente dita entre client e server.

java.net.Socket representa uma conexo entre client e server. Seus principais mtodos so:

Socket(String host, int port) throws UnknownHostException, IOException


Construtor. Recebe como parmetros o endereo IP do server e port ao qual conectar-se.
getOutputStream() : OutputStream throws IOException
obtm uma instncia do canal de sada (escrita) de informaes. Ver a seguir a conceituao de OutputStream.

getInputStream() : InputStream throws IOException


obtm uma instncia do canal de emtrada (leitura) de informaes. Ver a seguir a conceituao de InputStream.

Para enviar ou receber informaes, utilizam-se as classes InputStream e OutputStream. Entretanto, devido
possibilidade de atrasos, normalmente so utilizadas as classes BufferedInputStream e BufferedOutputStream, que
fornecem um buffer (rea de armazenamento temporrio) que evita as perdas de caracteres por over run (quando
a sada est lenta e perde-se um caracter, escrevendo um novo caracter sobre outro que ainda no foi enviado) ou
under run (idem, na leitura). Estas classes pertencem ao pacote java.io. Estas classes so utilizadas em todas as
situaes de entrada e sada de dados, como as relacionadas com arquivos, teclado, etc.

java.io.BufferedInputStream representa um stream (fluxo de dados contnuo) de leitura. Seus principais


mtodos so:

BufferedInputStream(InputStream in)
Construtor. Exige como parmetro um InputStream; neste caso, ser exatamente o retorno de
Socket.getInputStream()

read() : int throws IOException


Leitura de um caracter. Retorna -1 se o stream chegou ao final.

java.io.BufferedOutputStream representa um stream de escrita ou sada de dados. Seus principais mtodos so:

BufferedOutputStream(OutputStream out)
Construtor. Exige como parmetro um OutputStream; neste caso, ser exatamente o retorno de
Socket.getOutputStream()

write(int b) : void throws IOException


Escrita de um caracter.

write(byte[] b) : void throws IOException


Escrita de um vetor de caracteres.

flush() : void throws IOException


Fora a sada dos dados buferizados. At o flush(), os dados so somente armazenados no buffer de sada e somente
so efetivamente enviados pela chamada deste mtodo.

4.Parte Experimental

4.1.Comunicao Client-Server

Considere o programa do Anexo 1. Analise-o, verificando que contm a parte Client e Server, reunidas em um nico
arquivo por simplicidade didtica, encerradas nas classes SimpleClient e SimpleServer, respectivamente.

No SimpleServer, observe a seguinte sequncia de processamento:


criado um ServeSocket para escutar a porta SERVER_SOCKET (no caso, foi escolhido arbitrariamente a
porta 2001)
O Server colocado para escutar as requisies (chamada do mtodo ServerSocket.accept())
Ao receber uma conexo, o mtodo ServerSocket.accept() retorna uma instncia de Socket, que representa esta
conexo
Um BufferedInputStream criado para a leitura dos dados
Um while { } faz a leitura dos dados, caracter a caracter, terminando quando a chamada de bis.read() retorna -1
que significa que a conexo foi desfeita pelo client. Cada caracter recebido impresso na console.
No SimpleClient, observe a seguinte sequncia de processamento:
criada uma conexo com o server, com a instanciao da classe Socket informando-se HOST e PORT (no
caso, HOST=localhost e PORT=2001)
Obtm-se um canal de escrita de dados para este Socket (note que, neste caso inicial, foi usado um canal sem
bufferizao)
Um while { } faz enviar valores inteiros de 0 a 128 ao server.

Atividades:
a.Compile o programa
b.Abra duas janelas DOS, executando em uma o server:
c:\> java SimpleServer

e, na outra, o client:

c:\>java SimpleClient

c.Observe que o server recebe os dados enviados pelo Client


d.Obtenha o endereo IP do computador de algum colega, usando

c:\>netstat nr

Altere a constante HOST na classe SimpleClient, compile e execute novamente o client. Provavelmente no
funcionar, por causa do over-run. Assim, voc precisar alterar o seu Client, para utilizar o
BufferedOutputStream. No se esquea do flush() para enviar realmente os dados! Ficar algo como:
Socket s = new Socket(HOST, PORT);
BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
int i = 0;
while (i < 128) {
bos.write(i++);
} // while
bos.flush();

Perceba que agora os dados no so mais enviados ao seu Server mas ao Server de seu colega!

d.Altere o programa, para que o Server adicione 100 a cada valor recebido e o envie de volta ao Client, que deve
tambm ser capaz de ler as respostas enviadas pelo Server e imprim-las.

4.2.Aplicao de sockets: um WebServer

A base da Internet so os servidores Web, capazes de enviar uma pgina HTML (Hyper Text Markup Language) ao
seu navegador (browser).

O protocolo da camada de aplicao (ou seja, entre o webserver e o browser) conhecido como HTTP (Hyper Text
Transport Protocol). Quando voc digita em seu navegador uma requisio de acesso, como

http://www.poli.usp.br/mecatronica.html

o seu browser : (1)abre um socket para www.poli.usp.br e (2) envia uma string contendo
GET ./mecatronica.html HTTP/1.1 \n\n onde \n corresponde sequncia de caracteres ASCII 0x0D 0x0A ou CR
LF.

O webserver, recebendo esta requisio, obtm o nome do arquivo (no caso mecatronica.html) e l de seu disco
local este arquivo, enviando-o ao browser. Este arquivo deve estar formatado como uma pgina HTML.

Veja o programa do Anexo 2, que uma implementao simples (mas funcional!) de um WebServer. Analise-o,
notando que:
Um ServerSocket criado, indicando que a aplicao deseja escutar a porta SERVER_SOCKET (no caso,
2001).
Ao receber uma conexo, cria uma instncia de HttpResponder, cujo mtodo HttpResponder.processRequests()
responsvel por :
Ler os caracteres enviados pelo browser (HttpResponder.getRequest())
Obter, da requisio recebida, o nome do arquivo HTML desejado (HttpResponder.getFileName())
Ler o arquivo e enviar, via socket, os seu contedo (HttpResponder.sendFile())

Atividades
a.Crie, no diretrio onde se encontra o programa SimpleWebServer.java, um arquivo HTML (chame-o, por exemplo,
pagina.html) como por exemplo:
<html>
<body>pagina inicial
</body>
</html>

b.Modifique, no SimpleWebServer.java, a linha que indica onde esto as pginas HTML, modificando a linha onde
se define a varivel BASE_DIR. No se esquea de manter as barras normais (e no invertidas, como normal em
MS Windows) e colocar uma barra no final. Compile e execute o SimpleWebServer

c.Inicie o navegador e digite na barra de navegao

http://localhost:2001/pagina.html

Observe que foi designada a porta 2001, j que esta a porta que o nosso SimpleWebServer est configurado para
escutar.

c.Veja no seu navegador que a pgina HTML ser exibida.

d.Agora, digite no seu navegador uma linha semelhante, substituindo localhost pelo endereo IP da mquina de
algum de seus colegas. Verifique que voc capaz de ver a pgina que ele est disponibilizando. assim que
funciona a Internet!

Referncias

[Comer, 1994] Comer, D.E.; Stevens, D.L. Internetworking with TCP/IP. Prentice Hall, 1994.

[UNESP, 2003] UNESP. Apresentao sobre modelo OSI-ISO e TCP/IP. www.rc.unesp.br/polo/tcpip.ppt


Anexo 1: SimpleServer e SimpleClient
import java.net.ServerSocket;
import java.net.Socket;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.String;

class SimpleServer {

static final int SERVER_SOCKET = 2001;

public static void main(String[] args) {


try {
ServerSocket ss = new ServerSocket(SERVER_SOCKET);
while (true) {
Socket s = ss.accept();
BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
int ch;
while ( (ch = bis.read()) != -1) {
System.out.println("" + ch);
}
} // while
} catch(Exception e) {e.printStackTrace(); }
}
} // SimpleServer

class SimpleClient {

static final int PORT = 2001;


static final String HOST = "localhost";

public static void main(String[] args) {


try {
Socket s = new Socket(HOST, PORT);
OutputStream os = s.getOutputStream();
int i = 0;
while (i < 128) {
os.write(i++);
} // while
} catch(Exception e) {e.printStackTrace(); }
}
} // SimpleClient
Anexo 2: SimpleWebServer
import java.net.ServerSocket;
import java.net.Socket;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.String;
import java.util.Date;
import java.util.StringTokenizer;
import java.io.FileInputStream;

public class SimpleWebServer {

static final int SERVER_SOCKET = 2001;

public static void main(String[] args) {


try {
ServerSocket ss = new ServerSocket(SERVER_SOCKET);
while (true) {
Socket s = ss.accept();
HttpResponder hr = new HttpResponder(s);
hr.processRequests();
} // while
} catch(Exception e) {e.printStackTrace(); }
}

} // SimpleServer

class HttpResponder {
Socket m_Socket = null;
static String BASE_DIR=c:/mecatronica/

HttpResponder(Socket s) {
m_Socket = s;
} //HttpResponder

void processRequests() {
try {
String request = getRequest();
System.out.println(request);
String file = getFileName(request);
System.out.println(file);
sendFile(file);
} catch (Exception e) { e.printStackTrace(); }
} // processRequests

String getFileName(String request) {


StringTokenizer st = new StringTokenizer(request);
st.nextToken();
return st.nextToken();
} // getFileName

void sendFile(String filename) throws Exception{


OutputStream os = m_Socket.getOutputStream();
FileInputStream fis = new FileInputStream(BASE_DIR + filename);
byte[] bytes = new byte[2048];
fis.read(bytes);
os.write(bytes);
os.close();
} // sendFile

String getRequest() throws Exception {


BufferedInputStream bis = new BufferedInputStream(m_Socket.getInputStream());
int ch;
String request = "";
byte[] buf = new byte[1];
while ( (ch = bis.read()) != -1) {
//System.out.println("" + ch);
if (ch == 13) {
return request;
} else {
buf[0] = (byte)ch;
request += new String(buf);
}
} // while
return null;
} // getRequest
} // HttpResponder

[1] A expresso escutar um socket uma traduo literal do Ingls (to listen to a socket) e utilizada no meio tcnico.

Vous aimerez peut-être aussi