redes de comunicação modulo 6

20
Redes de comunicação Escola Profissional do Nervir 07-12-2011 Hugo Miranda Trabalho realizado para o módulo 6 da disciplina

Upload: hugo-miranda

Post on 02-Dec-2014

63 views

Category:

Documents


2 download

TRANSCRIPT

Redes de comunicação

Escola Profissional do Nervir

0 7 - 1 2 - 2 0 1 1

Hugo Miranda

Trabalho realizado para o módulo 6 da disciplina

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

Índice

Introdução....................................................................................................................................2

1. Modelo de programação cliente-servidor................................................................................2

a. Servidores Mono-Clientes e Multiclientes................................................................................3

Servidor Mono-Cliente.............................................................................................................3

Servidor Multicliente............................................................................................................3

b. Resolução e formação de endereços IP....................................................................................3

2. O interface Socket....................................................................................................................4

a. Sockets UDP e TCP................................................................................................................4

Sockets UDP.........................................................................................................................4

b. Criação de sockets....................................................................................................................5

c. Associação de sockets com a ligação........................................................................................7

d. Envio e recepção de informação via socket.............................................................................8

3.Exemplo simples de programação de um servidor....................................................................9

4.Exemplo simples de programação de um cliente....................................................................13

Conclusão...................................................................................................................................17

Bibliografia.................................................................................................................................17

1

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

Introdução

Este trabalho no âmbito do módulo 6 da disciplina de Redes de Comunicação é designado para conhecermos ,vários tipo de programação entre clientes e servidores e também os seus interfaces ,para isso apresentando exemplos e desenvolvimentos .

1. Modelo de programação cliente-servidor

O paradigma de programação distribuída através da separação das aplicações entre servidores (aplicações que disponibilizam algum serviço) e clientes (aplicações que usam esses serviços) foi a arquitetura de distribuição predominante nos anos 1990. Um dos seus atrativos é o aumento da confiabilidade (a falha de uma máquina não necessariamente inviabiliza a operação do sistema como um todo) e redução de custo (máquinas mais simples podem executar os serviços isoladamente, ao invés de ter uma grande máquina fazendo todos os serviços).

As aplicações clientes e servidoras são programas executando em máquinas distintas, trocando informação através de uma rede de computadores. Para que os serviços possam ser solicitados, a aplicação cliente deve conhecer quem fornece o serviço (o endereço da aplicação servidora) e qual o protocolo pré-estabelecido para realizar a solicitação.

Entre as vantagens citadas para o modelo de programação cliente-servidor destacam-se:

Relaciona a execução de processos distintos. Oferece uma estruturação do processamento distribuído baseado no conceito de

serviços: Servidor: provedor de serviços Cliente: consumidor de serviços Permite compartilhamento de recursos Servidor pode atender a vários clientes Oferece transparência de localização Tratamento uniforme independentemente de processos estarem na mesma

máquina ou em máquinas distintas Permite a comunicação através da troca de mensagens Arquitectura fracamente acoplada Mensagens para solicitações (cliente para servidor) e respostas (servidor para

cliente) Encapsula serviços Cliente não precisa saber como servidor implementa o serviço, mas apenas a

interface para solicitação e resposta.

2

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

a. Servidores Mono-Clientes e Multiclientes

Servidor Mono-Cliente

Um mono cliente, é um computador cliente numa rede de modelo cliente-servidor de duas camadas o qual tem poucos ou nenhum aplicativo instalado, de modo que depende primariamente de um servidor central para o processamento de actividades. A palavra mono se refere a uma pequena imagem de boot que tais clientes tipicamente requerem - talvez não mais do que o necessário para fazer a conexão com a rede e iniciar um navegador web dedicado ou uma conexão de “Área de Trabalho Remota” tais como X11, Citrix ICA ou Microsoft RDP.

Servidor Multicliente

Multicliente é um computador (cliente) no cliente-servidor que normalmente fornece a funcionalidade independentemente do central servidor.

Multicliente necessita ainda de pelo menos periódica ligação a uma rede ou servidor central, mas é muitas vezes caracterizado pela capacidade de executar várias funções.

b. Resolução e formação de endereços IP

Os endereços da Internet são conhecidos pelos nomes associados aos endereços IP (por exemplo, www.google.pt). Para que isto seja possível, é necessário traduzir (resolving) os nomes em endereços IP.

O Domain Name System (DNS) é um mecanismo que converte os nomes em endereços IP e endereços IP em nomes. Assim como o endereçamento CIDR, os nomes DNS são hierárquicos e permitem que faixas de espaços de nomes sejam delegados a outros DNS.

Os computadores comunicam - se entre eles graças ao protocoloIP (Internet Protocol), que utiliza endereços numéricos, chamados endereços IP, compostos por 4 números inteiros (4 bytes) entre 0 e 255 e escritos sob a forma de xxx.xxx.xxx.xxx. Por exemplo, 194.153.205.26.

3

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

Estes endereços numa rede servem para que os computadores se comuniquem entre si, cada computador tem um endereço IP único.

O ICANN (Internet Corporation for Assigned Names and Numbers, substituindo o IANA, Internet Assigned Numbers Agency, desde 1998) é encarregado de atribuir endereços IP públicos, quer dizer os endereços IP dos computadores que estam conectados a uma rede pública de Internet.

2. O interface Socket

a. Sockets UDP e TCP

Sockets UDP

UDP não estabelece conexão. O remetente coloca explicitamente endereço IP e Porta do destino. O servidor deve extrair servidores IP, porta do remetente do data grama recebido. Os dados recebidos podem ser recebidos fora de ordem, ou perdidos.

Sockets TCP

Um socket TCP cria uma ligação stream bidireccional entre os endereços ‘hostC,portC’ e ‘hostS,portS’, ou seja, entre uma aplicação cliente em execução na máquina ‘hostC’ consegue controlar também a porta ‘portC’ e outra aplicação servidora em execução na máquina ‘hostS’ conseguindo a visualização da porta ‘portS’ de ‘hostS’.

A aplicação cliente utiliza a porta ‘portC’ da máquina ‘hostC’ para enviar solicitações de serviços e para receber retornos a suas solicitações. A aplicação servidora visualiza constantemente a porta ‘portS’ da máquina ‘hostS’ aguardando a chegada de solicitações de serviço. Quando alguma solicitação é recebida, a aplicação servidora executa o serviço e utiliza a conexão para enviar o retorno com os resultados do serviço.

4

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

b. Criação de sockets

Este texto não tem como objectivo o aprendizado da linguagem Java, portanto só serão demonstradas e explicadas as linhas de códigos referentes às instruções que são utilizadas no programa exemplificado pela ilustração acima.

Começando com a aplicação que será hospedada no Servidor.

No início do programa, deverá ser inserida essas linhas que importam a biblioteca que contém as classes que são utilizadas em uma aplicação com Socket(java.net.*) e as classes de recepção de informação do teclado ou Socket do cliente ou servidor(java.io.*).

import java.io.*;

import java.net.*;

Aqui criamos um objecto welcomeSocket é o socket do lado do servidor, numero_da_porta deverá ser substituído pelo número da porta pela qual a aplicação cliente usará para conectar com o servidor. Este socket esperará a requisição de conexão de um cliente.

ServerSocket welcomeSocket = new ServerSocket(numero_da_porta);

5

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

Como o programa servidor normalmente fica a funcionar por tempo indefinido, coloca-se o restante das instruções dentro de um loop infinito, como segue:

while(true) {

A próxima instrução cria um objecto connectionSocket do tipo Socket quando um cliente conectar ao servidor. O TCP encarregará de criar uma conexão virtual direta entre esse socket e o socket do cliente de forma que todos os bytes serão enviados ao servidor na ordem certa.

Socket connectionSocket = welcomeSocket.accept();

No caso do envio de um objecto do tipo String do cliente para o servidor, utilizamos as seguintes instruções para receber os dados do cliente.

BufferedReader infoDoCliente = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream());

String mensagemDoCliente = infoDoCliente.readLine();

Depois de processar a informação enviada pelo cliente, queremos enviar um outro objecto(mensagem_para_cliente) do tipo String de volta para o cliente, como um mensagem de dado recebido ou algo do tipo.

DataOutputStream infoParaCliente = new DataOutputStream(connectionSocket.getOutputStream());

infoParaCliente.writeBytes(mensagem_para_cliente);

Com isso termina-se o programa do lado do Servidor.

6

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

c. Associação de sockets com a ligação

As ligações são estabelecidas de duas formas:

passivo: espera que um participante activo faça o pedido de ligação;

activo: inicia um pedido de ligação ao lado passivo;

Após existir uma ligação , pode existir tranferencia de dados (envio e recepção) e qualquer um deles pode desligar a mesma .

Os cinco passos para estabelecer uma ligação são:

Passo 1: (part. passivo) fica à espera de pedidos de ligação

Passo 2: (part. activo) faz pedido e estabelece ligação

Passo 3: (part. passivo) aceita pedido de ligação

Passo 4: (part. passivo) comunica dados

Passo 5: (part. activo) comunica dados

7

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

d. Envio e recepção de informação via socket

Envio de um socket

int count =sendto (sockid, &buf, len, flags, &addr, addrlen)

count, sockid, buf, len: como no send

addr: endereço do destino (struct sockaddr)

addrlen: sizeof (add)

Recpção de um socket

int count =recvfrom (sockid, &buf, len, flags, &addr, addrlen)

count, sockid, buf, len: como no recv

addr: endereço da origem (struct sockaddr)

addrlen: sizeof (add)

8

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

3.Exemplo simples de programação de um servidor

using System.IO;

using System.Net;

using System;

using System.Threading;

using N = System.Net;

using System.Collections;

class TalkServ {

System.Net.Sockets.TcpListener server;

public static Hashtable handles;

public static Hashtable handleByConnect;

public static void Main() {

TalkServ TS = new TalkServ();

}

public TalkServ() {

handles = new Hashtable(100);

handleByConnect = new Hashtable(100);

server = new System.Net.Sockets.TcpListener(4296);

while(true) {

server.Start();

9

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

if(server.Pending()) {

N.Sockets.TcpClient connection = server.AcceptTcpClient();

Console.WriteLine("Connection made");

BackForth BF = new BackForth(connection);

}

}

}

public static void SendToAll(string name,string msg) {

StreamWriter SW;

ArrayList ToRemove = new ArrayList(0);

N.Sockets.TcpClient[] tc = new N.Sockets.TcpClient[TalkServ.handles.Count];

TalkServ.handles.Values.CopyTo(tc,0);

for(int i=0;i<tc.Length;i++) {

try {

if(msg.Trim()==""||tc[i]==null)

continue;

SW = new StreamWriter(tc[i].GetStream());

SW.WriteLine(name + ": " + msg);

SW.Flush();

SW = null;

} catch(Exception e44) { e44 = e44;

string g = (string) TalkServ.handleByConnect[tc[i]];

TalkServ.SendSysMsg("** " + g + " ** HAS LEFT US.");

TalkServ.handles.Remove(g);

TalkServ.handleByConnect.Remove(tc[i]);

}

10

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

}

}

public static void SendSysMsg(string msg) {

StreamWriter SW;

ArrayList ToRemove = new ArrayList(0);

N.Sockets.TcpClient[] tc = new N.Sockets.TcpClient[TalkServ.handles.Count];

TalkServ.handles.Values.CopyTo(tc,0);

for(int i=0;i<tc.Length;i++) {

try {

if(msg.Trim()==""||tc[i]==null)

continue;

SW = new StreamWriter(tc[i].GetStream());

SW.WriteLine(msg);

SW.Flush();

SW = null;

} catch(Exception e44) { e44 = e44;

TalkServ.handles.Remove(TalkServ.handleByConnect[tc[i]]);

TalkServ.handleByConnect.Remove(tc[i]);

}

}

}

}//end of class TalkServ

class BackForth {

N.Sockets.TcpClient client;

System.IO.StreamReader SR;

11

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

System.IO.StreamWriter SW;

string handle;

public BackForth(System.Net.Sockets.TcpClient c) {

client = c;

Thread t = new Thread(new ThreadStart(init));

t.Start();

}

private string GetHandle() {

SW.WriteLine("What is your handle? ");

SW.Flush();

return SR.ReadLine();

}

private void run() {

try {

string l = "";

while(true) {

l = SR.ReadLine();

TalkServ.SendToAll(handle,l);

}

} catch(Exception e44) { Console.WriteLine(e44); }

}

private void init() {

SR = new System.IO.StreamReader(client.GetStream());

12

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

SW = new System.IO.StreamWriter(client.GetStream());

SW.WriteLine("WELCOME TO TalkServ! Be Nice!");

//SW.WriteLine("What is your handle? ");

//SW.Flush();

handle = GetHandle();

while(TalkServ.handles.Contains(handle)) {

SW.WriteLine("ERR - Handle already exists!");

handle = GetHandle();

}

TalkServ.handles.Add(handle,client);

TalkServ.handleByConnect.Add(client,handle);

TalkServ.SendSysMsg("** " + handle + " ** HAS JOINED US.");

SW.WriteLine("Now Talking.....\r\n-------------------------------");

SW.Flush();

Thread t = new Thread(new ThreadStart(run));

t.Start();

}

}

4.Exemplo simples de programação de um cliente

using System.IO;

using System.Net;

using System;

using System.Threading;

using N = System.Net;

using System.Collections;

using System.Windows.Forms;

13

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

using System.ComponentModel;

using System.Runtime.InteropServices;

class TalkUser {

static Form talk;

static N.Sockets.TcpClient TC;

[DllImport("kernel32.dll")]

private static extern void ExitProcess(int a);

public static void Main() {

talk = new Form();

talk.Text = "TalkUser - The OFFICIAL TalkServ Client";

talk.Closing += new CancelEventHandler(talk_Closing);

talk.Controls.Add(new TextBox());

talk.Controls[0].Dock = DockStyle.Fill;

talk.Controls.Add(new TextBox());

talk.Controls[1].Dock = DockStyle.Bottom;

((TextBox)talk.Controls[0]).Multiline = true;

((TextBox)talk.Controls[1]).Multiline = true;

talk.WindowState = FormWindowState.Maximized;

talk.Show();

((TextBox)talk.Controls[1]).KeyUp += new KeyEventHandler(key_up);

TC = new N.Sockets.TcpClient();

TC.Connect("IP OF A SERVER HERE",4296);

Thread t = new Thread(new ThreadStart(run));

14

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

t.Start();

while(true) {

Application.DoEvents();

}

}

private static void talk_Closing(object s, CancelEventArgs e) {

e.Cancel = false;

Application.Exit();

ExitProcess(0);

}

private static void key_up(object s,KeyEventArgs e) {

TextBox TB = (TextBox)s;

if(TB.Lines.Length>1) {

StreamWriter SW = new StreamWriter(TC.GetStream());

SW.WriteLine(TB.Text);

SW.Flush();

TB.Text = "";

TB.Lines = null;

}

}

private static void run() {

StreamReader SR = new StreamReader(TC.GetStream());

while(true) {

Application.DoEvents();

15

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

TextBox TB = (TextBox)talk.Controls[0];

TB.AppendText(SR.ReadLine()+"\r\n");

TB.SelectionStart = TB.Text.Length;

}

}

}

16

Hugo Miranda, Modulo 6 Redes de comunicação, Escola Profissional do Nervir

Conclusão

Com este trabalho exponho aqui exemplo de programação e também duvidas sobre interfaces.

Bibliografia

http://www.developerfusion.com/code/3574/a-chat-clientserver-program-for-c/

http://www.dca.fee.unicamp.br/cursos/PooJava/network/cs.html

http://pt.wikipedia.org/wiki/Cliente-servidor

17