·

Engenharia de Computação ·

Linguagens de Programação

Envie sua pergunta para a IA e receba a resposta na hora

Fazer Pergunta

Texto de pré-visualização

Linguagem de Programação II Carlos Eduardo Batista Centro de Informática UFPB biduciufpbbr Roteiro Introdução Comunicação Inter Processos Modelo ClienteServidor Sockets Sockets em CC Sockets em Java Introdução Arquitetura de Sistemas Sistema Multitarefa Sistema Multiprocessador Sistemas Distribuídos Consiste de vários computadores que operam independentemente mas que se comunicam através de uma rede Processos comunicantes CPU Memória Local CPU Memória Local CPU Memória Local CPU Memória Local 1 computador Introdução Comunicação em rede em geral Arquitetura em Camadas Programas CJava em rede operam no nível da camada de Aplicação Camadas inferiores exigem programação de mais baixo nível Entendimento sobre os protocolos de transporte TCP e UDP se faz necessário Protocolos Internet TCPIP Camada Protocolo Aplicaçã o HTTP SMTP FTP SSH RTP Telnet SIP RDP IRC SNMP NNTP POP3 IMAP BitTorrent DNS Ping Transpor te TCP UDP SCTP DCCP Rede IP IPv4 IPv6 ARP RARP ICMP IPSec Enlace Ethernet 80211 WiFi IEEE 8021Q 80211g HDLC Token ring FDDI PPPSwitch Frame Relay Física Modem RDIS RS232 EIA422 RS449 Bluetooth USB Introdução Protocolos Conceito geral São regras para a comunicação entre duas ou mais aplicações computadores ou dispositivos Em programação Protocolos são funções que implementam serviços de comunicação Ou seja protocolos são a interface de um módulo ou de uma camada de rede Exemplos TCPIP Telnet HTTP SMTP FTP Introdução Comunicação pela Internet TCP Transmission Control Protocol Estabelece conexão connectionbased Analogia ligação telefônica Conexão é estabelecida depois que o número é discado e a pessoa atende à ligação Ordem de entrega é fundamental Perda de mensagens compromete a comunicação Canal de comunicação confiável Introdução Comunicação pela Internet UDP User Datagram Protocol Não estabelece conexão not connectionbased Analogia telegrama Ordem de entrega não importa Entrega não é garantida Mensagens são independentes Canal de comunicação não confiável Introdução Computadores possuem uma única conexão física para rede Computadores podem executar muitas aplicações ao mesmo tempo locais ou em rede Dados que chegam pela rede precisam ser endereçados localmente para a aplicação correta Uso de portas de comunicação Identificar processos comunicantes Introdução Dados são transmitidos juntamente com informação para identificar o computador e a porta a qual se destinam Pacote O endereço IP é utilizado pelo protocolo IP rede para identificar o computador de destino A porta é utilizada pelo TCP ou UDP para identificar a aplicação de destino Valor inteiro no intervalo de 0 à 65535 Valores n0 intervalo de 0 à 1023 são reservadas para serviços comuns como HTTP e FTP Endereço IP 32 ou 64 bits Porta 16 bits Dados Comunicação inter processos Troca de mensagens Memória compartilhada Comunicação Interprocessos APLICAÇÃO DISTRIBUÍDA sockets MIDDLEWARE RMI RPC CORBA PROTOCOLOS SIST OPER HARDWARE PLATAFORMA PROTOCOLOS SIST OPER HARDWARE Modelo ClienteServidor Modelo de referência adotado em sockets Cliente Processo ou aplicação que requisita um serviço oferecido por um servidor Servidor Processo ou aplicação que aceita as requisições dos clientes e realiza o processamento delas Não há troca de informações direta entre os clientes a comunicação é sempre intermediada pelo servidor Interação Paradigma requisiçãoresposta Sockets Conceito Mecanismo de troca de dados entre dois ou mais processos distintos que podem estar em execução na mesma máquina ou máquinas diferentes em rede Representação interna do sistema operacional para um ponto de comunicação Programação dependente de plataforma A interface padronizada de sockets surgiu originalmente no sistema operacional Unix BSD Berkeley Software Distribution Origem da denominação Berkeley Sockets Sockets É representado por um par endereçoip porta Clientes e servidores se comunicam realizando operações de escrita e leitura em seus sockets Sockets Pilha de rede do SO Processo m Porta m Processo 1 Porta 1 Host1 Pilha de rede do SO Processo k Porta k Processo 1 Porta 1 Host n Rede Endereço IP1 Endereço IP n Tipos de Sockets Em função do protocolo adotado Stream Socket TCP Servidor mantém um socket único para cada cliente canal dedicado Datagram Socket UDP Servidor pode usar um mesmo socket para se comunicar com diferentes clientes canal compartilhado Tipos de Socket Stream Socket Trata a comunicação como um fluxo contínuo de bytes entre cliente e servidor Utiliza o protocolo TCP Garante a chegada de tudo que for enviado e na ordem correta Tipos de Socket Datagram Socket As mensagens são enviadas isoladamente Utiliza o protocolo UDP Não garante a entrega de dados no destino nem a ordem Socket cliente e servidor Cliente socket connect writesend readreceive close Servidor socket bind listen accept readreceive writesend close Sockets e portas socket any port agreed port socket client server message other ports Internet address 1383794248 Internet address 1383788249 Sockets e portas Client Request Ouve Server Comunica Socket cliente e servidor O servidor apenas fica ouvindo o Socket aguardando um pedido de conexão do cliente O cliente sabe o nome do host e qual porta está associada à aplicação servidora Assim que o servidor aceitar a conexão este cria um novo Socket e conseqüentemente o associa a uma nova porta e pode ficar esperando novas conexões no Socket original enquanto atende às requisições do cliente pelo novo Socket Principais Primitivas Linguagem C Função Descrição socket Cria um socket precisa especificar o protocolo UDP ou TCP bind Associa o socket criado a uma identificação constituída por endereço IP da máquina onde reside o servidor e número de porta associado à aplicação close Fecha o socket listen Habilita o socket a aceitar pedidos de conexão tornandoo um socket de servidor TCP accept Recebe um pedido de conexão por parte da aplicação cliente bloqueante connect Cria a conexão entre o socket do cliente com o socket do servidor cujo endereço está especificado nos parâmetros A conexão fica bloqueada até o socket obter uma resposta do servidor read Ler dados de um socket TCP recvfro m Ler dados de um socket UDP write Envia dados a um socket TCP sendto Envia dados ao socket UDP Sockets em CC int socketint family int type int protocol int family indica a família de protocolos que será utilizada PFINET int type define o tipo de socket a ser criado para UDP SOCKDGRAM e para TCP SOCKSTREAM int protocol identifica o protocolo específico a ser usado Neste caso será nulo já que os dois primeiros argumentos já identificam exclusivamente o protocolo Se o socket é criado retorna o descritor de arquivos para este socket caso contrário retorna um valor negativo Sockets em CC Associação do socket a uma porta Função bind int bindint socket struct sockaddr address int addrlen int socket é o socket criado pela função socket struct sockaddr address é a estrutura de endereçamento que contém as informações necessárias para o estabelecimento da associação int addrlen é o tamanho dessa estrutura pois dependendo da família e do protocolo utilizados ele varia Retorna um valor negativo em caso de insucesso Sockets em CC struct sockaddrin short int sinfamily unsigned short int sinport struct inaddr sinaddr unsigned char sinzero8 O primeiro item da estrutura define o tipo de família do protocolo a ser usado AFINET O segundo indica o número da porta TCP ou UDP usada na comunicação entre os processos Para se atribuir o valor a este item é necessário usar uma função que transforma a representação de dados do host na representação de dados da rede Sockets em CC sinsinport htons SERVERPORT onde SERVERPORT é o número da porta a ser utilizada O terceiro item é o endereço IP do host de destino No caso do servidor utilizase a constante INADDRANY Nos clientes usaremos a função inetaddr ou gethostbyname O quarto item sinzero existe para zerar a parte da estrutura que não foi usada já que é alocado espaço para o maior tamanho de endereço possível Sockets em CC int listenint socket int backlog Fila de Conexões Pendentes Instrui o socket a esperar pela conexão de um cliente int acceptint socket struct sockaddr address int addrlen Estabelecimento da Conexão aceita conexão com o cliente int connectint socket struct sockaddr address int addrlen Conexão Usado pelo cliente para estabelecer conexão com o servidor Sockets em CC ssizet sendtoint socket char message int msglen int flags struct sockaddr address int addrlen Envio de mensagens usando UDP char message é o endereço da variável onde se encontra a mensagem que se deseja transmitir pelo socket int msglen tamanho dessa mensagem int flags é um conjunto de flags que controlam certos detalhes da operação mas que podem receber um valor nulo struct sockaddr address estrutura de endereçamento de destino int addrlen tamanho da estrutura de endereçamento sizeof address Retorna o número de bytes enviados ou 1 em caso de erro Sockets em CC ssizet recvfromint socket char buffer int bufferlen int flags struct sockaddr address int addrlen Recepção de mensagens usando UDP Argumentos similares a função sendto A função retorna além do datagrama recebido no segundo argumento a estrutura de endereçamento da origem de forma que o destino possa enviarlhe uma resposta quinto argumento e o número de bytes da área de dados recebidos ou 1 em caso de erro Sockets em CC readsocket buffer lenght Lê o conteúdo do buffer associado ao Socket writesocket buffer lenght Escreve dados em um buffer associado ao Socket Sockets em CC gethostbynamehost Extrai o endereço IP a partir do nome de um Host getprotobynameprotocol Extrai o código correspondente ao protocolo a partir de uma string que o define htonsaddr Converte um endereço para o padrão de rede Big endian Sockets em CC int closeint socket Fechando o socket A função retorna um valor nulo em caso de sucesso Bibliotecas include systypesh include syssocketh include netinetinh include netdbh Sockets em CC include stdioh include stdlibh include arpaineth include systypesh include syssocketh struct sockaddrin destino int conexao int esocket main esocket socketAFINETSOCKSTREAM0 ifesocket 0 perrorERRO exit1 destinosinfamily AFINET destinosinport htons22 destinosinaddrsaddr inetaddr127001 bzerodestinosinzero8 conexao connectesocketstruct sockaddr destino sizeofdestino ifconexao 0 perrorPorta fechada closeesocket exit1 printfA PORTA 22 DO SSH ESTA ABERTA closeesocket Practical Socket httpcsecsbayloredudonahooprac ticalCSocketspractical PracticalSocketh e PracticalSocketcpp Hierarquia Socket CommunicatingSocket TCPSocket UDPSocket TCPServerSocket Exemplo servidor int mainint count char strings int sd int portDEFAULTPORT struct sockaddrin addr if count 2 printfusage s portnum Using default port d strings1 port else port atoistrings1 sd socketPFINET SOCKSTREAM 0 bzeroaddr sizeofaddr addrsinfamily AFINET addrsinport htonsport addrsinaddrsaddr INADDRANY if bindsd struct sockaddraddr sizeofaddr 0 PANICbind if listensd 20 0 PANIClisten Exemplo servidor while 1 char buffer1024 int client acceptsd 0 0 printfconnected sendclient buffer recvclient buffer sizeofbuffer 0 0 closeclient return 0 Exemplo cliente int mainint count char strings int sd int portDEFAULTPORT char host127001 struct sockaddrin addr int addrlen sizeofaddr char buffer1024 if count 3 port atoistrings2 host strings1 else printfusage s servers address servers port using default port d strings0 port sd socketPFINET SOCKSTREAM 0 Exemplo cliente Set destination address bzeroaddr sizeofaddr addrsinfamily AFINET addrsinport htonsport inetatonhost addrsinaddr Send message using directed protocol if sendtosd sean 5 0 struct sockaddraddr sizeofaddr 0 PANICsendto bzerobuffer sizeofbuffer Get message using directed protocol recvfromsd buffer sizeofbuffer 0 struct sockaddraddr addrlen printfs buffer closesd Sockets em C httpswwwcsutaheduswaltonlistin gssocketsprogramspart1 BOOST Lib httpwwwboostorg A simple C interface for TCPIP httpworkdebayanguptacomsocketL ibReportpdf Sockets em Java Java utiliza um mecanismo genérico que permite tratar ES de forma uniforme Streams de entrada e saída Pacote javaio Acesso aos meios externos de armazenamento são considerados equivalentes Origem destino Arquivos conexões de rede memória Informações podem ter vários tipos Bytescaracteres dados objetos Comunicação por sockets é apenas uma operação de ES Pacote javanet Operações de ES em Java Stream de Entrada Obtenção de informações Aplicação abre um stream de uma fonte arquivo socket memória e lê de maneira sequencial Fonte Informação Aplicaçã o stream lê Sockets em Java Operações de ES em Java Stream de Saída Envio de informações Aplicação abre um stream para um destino arquivo socket memória e escreve de maneira sequencial escreve Fonte Informação Aplicaçã o stream Sockets em Java Operações de ES em Java Pacote javaio Duas hierarquias de classes InputStream OutputStream Hierarquia utilizada para comunicação por sockets Streams de bytes dados binários InputStream Método abstrato read para ler um byte de uma stream OutputStream Método abstrato write para escrever um byte em uma stream Reader Writer Streams de caracteres Sockets em Java Sockets em Java Operações básicas sobre um socket Socket TCP Cliente Servidor Abrir conexão Esperar conexão Enviar dados Aceitar conexão Receber dados Enviar dados Fechar conexão Receber dados Fechar conexão Exemplo 1 Programa de batepapo Cliente A se conecta ao servidor Servidor cria uma conexão e adiciona o Cliente A à lista de participantes Cliente B se conecta Servidor cria uma conexão e adiciona o Cliente B à lista de participantes Cliente A envia uma mensagem para o serviço de batepapo Servidor distribui a mensagem para todos os participantes Clientes A e B Cliente A se conecta ao servidor Socket chatSocketA new Socket1961641103 5000 Cliente A envia uma mensagem para o serviço de batepapo PrintWriter writerA new PrintWriterchatSocketAgetOutputStream String message Oi writerAprintln message Cliente A recebe a mensagem do servidor InputStreamReader streamA new InputStreamReader chatSocketAgetInputStream BufferedReader readerA new BufferedReaderstreamA String answerA readerAreadLine Exemplo 1 Cliente A Exemplo 1 Cliente B Cliente B se conecta ao servidor Socket chatSocketB new Socket1961641103 5000 Cliente B recebe a mensagem do servidor InputStreamReader streamB new InputStreamReader chatSocketBgetInputStream BufferedReader readerB new BufferedReaderstreamB String answerB readerBreadLine Cliente A Servidor Mensagem ex String 01101001 1 PrintWriter Fluxo de saída caracteres bytes Servidor cria socket para receber pedidos de conexão ServerSocket serverSock new ServerSocket5000 Servidor cria uma conexão e adiciona o Cliente A à lista de participantes Socket sockA serverSockaccept Servidor cria uma conexão e adiciona o Cliente B à lista de participantes Socket sockB serverSockaccept IMPORTANTE Accept é bloqueante O objeto Socket retornado por Accept sabe o endereço IP do cliente e define automaticamente uma porta para se comunicar somente com esse cliente Exemplo 1 Servidor Exemplo 1 Servidor Servidor recebe mensagem do Cliente A InputStreamReader stream new InputStreamReader sockAgetInputStream BufferedReader reader new BufferedReaderstream String message readerreadLine Servidor envia a mesma mensagem para os Clientes A e B PrintWriter writer new PrintWritersockAgetOutputStream writerprintln message writer new PrintWritersockBgetOutputStream writerprintln message Cliente A Servidor 011010011 bytes Caracteres Caracteres armazenado s em buffer BufferedReader InputStreamReader Fluxo de entrada Exemplo 1 Fechar conexão Servidor sockAclose sockBclose serverSockclose Cliente A chatSocketAclose Cliente B chatSocketBclose Sockets em Java Chamadas de bind connect e listen são abstraídas Classes Socket e ServerSocket oferecem vários construtores Uma porta só pode ser vinculada à um programa por vez BindException Como o cliente faz para saber o número da porta do programa de servidor com o qual quer se conectar Serviços padrão usam porta fixa Exemplos HTTP 80 Telnet 23 POP3 110 SMTP 25 Portas de 0 a 1023 Outros serviços Autor deve publicar o IP o número da porta e o protocolo do serviço IP de localhost 127001 Usado para testar aplicações cliente e servidor na mesma máquina Operação de Leitura InputStream lida com bytes InputStreamReader Converte bytes em caracteres Fluxo intermediário BufferedReader Leitura mais eficiente Somente quando o buffer está cheio é que é feita a solitação de leitura na fonte de informação aqui é o socket Sem usar buffer há múltiplas solicitações de leitura Scanner Não implementa a interface InputStream Pode receber um InputStream como argumento Facilidade para leitura de String Sockets em Java Operação de Escrita OutputStream lida com bytes PrintWriter Escrita de String BufferedWriter Escrita mais eficiente Somente quando o buffer está cheio é que é feita a solitação de escrita no destino aqui é o socket Sem usar buffer há múltiplas solicitações de escrita Sockets em Java Exemplo 2 Servidor recebe n requisições Solução concorrente servidor multithread Passos Servidor espera por pedido de conexão Servidor aceita pedido de conexão Servidor cria thread para o cliente Thread do servidor Recebe mensagem de cliente Envia mensagem ao cliente Fecha conexão Exemplo 2 Cliente public class HelloClient public static void mainString args int port 2345 try Socket s new Socket127001port Envia OutputStream outstream sgetOutputStream PrintWriter out new PrintWriteroutstream true outprintHello Server Recebe InputStream instream sgetInputStream Scanner in new Scannerinstream String answer innext sclose catch IOException e Exemplo 2 Servidor Iterativo public class HelloServer public static void mainString args try ServerSocket ss new ServerSocket2345 while true n clientes 1 cliente por vez Socket s ssaccept Recebe InputStream instream sgetInputStream Scanner in new Scannerinstream String msg innext Envia String response Hello client sgetInetAddress on port sgetPort OutputStream outstream sgetOutputStream PrintWriter out new PrintWriteroutstream true outprintresponse sclose ssclose catch IOException e Exemplo 2 Servidor Concorrente public class ServerTask implements Runnable private Socket s public ServerTaskSocket socket thiss socket public void run try Recebe InputStream instream sgetInputStream Scanner in new Scannerinstream String msg innext Envia String response Hello client sgetInetAddress on port sgetPort OutputStream outstream sgetOutputStream PrintWriter out new PrintWriteroutstream true autoflush outprintresponse sclose catch IOException e public class HelloServer public static void mainString args int port 2345 try ServerSocket ss new ServerSocketport while true Socket s ssaccept Thread t new Thread new ServerTasks tstart catch IOException e Classe DatagramSocket Define um socket para envio e recepção de pacotes do tipo datagram Classe DatagramPacket Define um pacote de dados do tipo datagram cuja transmissão não é segura Servidores e clientes UDP utilizam essas classes igualmente Programação mais trabalhosa Sockets em Java import javaio import javanet import javautil public class QuoteClient public static void mainString args throws IOException if argslength 1 SystemoutprintlnUsage java QuoteClient hostname return get a datagram socket DatagramSocket socket new DatagramSocket send request byte buf new byte256 InetAddress address InetAddressgetByNameargs0 DatagramPacket packet new DatagramPacketbuf buflength address 4445 socketsendpacket get response packet new DatagramPacketbuf buflength socketreceivepacket display response String received new StringpacketgetData 0 packetgetLength SystemoutprintlnQuote of the Moment received socketclose import javaio import javanet import javautil public class QuoteServerThread extends Thread protected DatagramSocket socket null protected BufferedReader in null protected boolean moreQuotes true public QuoteServerThread throws IOException thisQuoteServerThread public QuoteServerThreadString name throws IOException supername socket new DatagramSocket4445 try in new BufferedReadernew FileReaderonelinerstxt catch FileNotFoundException e SystemerrprintlnCould not open quote file Serving time instead Servidor UDP Exemplo public void run while moreQuotes try byte buf new byte256 receive request DatagramPacket packet new DatagramPacketbuf buflength socketreceivepacket figure out response String dString null if in null dString new DatetoString else dString getNextQuote buf dStringgetBytes send the response to the client at address and port InetAddress address packetgetAddress int port packetgetPort packet new DatagramPacketbuf buflength address port socketsendpacket catch IOException e eprintStackTrace moreQuotes false socketclose protected String getNextQuote String returnValue null try if returnValue inreadLine null inclose moreQuotes false returnValue No more quotes Goodbye catch IOException e returnValue IOException occurred in server return returnValue Projeto final Produtor Thread P1 Consumid or Thread C1 Thread Cn Processo C1 Processo Cn UD P Sistema de Arquivos Buffer limitado Referências Unix Network Programming Richard Stevens Prentice Hall 2ª edição Volume 1 OReilly Java Network Programming 2nd Edition Tutoriais Sun httpjavasuncomdocsbookstutorialnetworkingsocke tsindexhtml Kathy Sierra Bert Bates Head First Java 2nd Edition Alta Books Notas de aula Profa Thaís Alves Burity Pereira httpwwwusrinfufsmbrsandroelc1018 aula1php httpnptelacincoursesWebcoursecontentsIIScB ANGOperating20SystemspdfLectureNotesMod 207LNpdf Beejs Guide to Network Programming httpbeejusguidebgnet