25

Instituto de Computação UNICAMPcelio/inf514-2010/docs/pdf/slides.pdfO módulo socket de Python - Exemplos A aplicação Cliente-Servidor serviço de eco Detalhamento das atividades

Embed Size (px)

Citation preview

01/24/11

Instituto de ComputaçãoUNICAMP

Inf 514 � Programação Básica em Redes de Computadores

Prof. Célio Guimarã[email protected]

Curso de Especialização em Redes de Computadores � Inf 514

� Objetivos� Cobrir técnicas para programação de

serviços de redes de computadores usando a linguagem Python.

� Aplicação dos conceitos através de trabalhos práticos.

� Uma aplicação simples Cliente-Servidor será desenvolvida pelos alunos usando a biblioteca de sockets de Python

Curso de Especialização em Redes de Computadores � Inf 514

Plano do Curso: Python� Por que Python?� Conceitos básicos� Cadeias (strings): indexação, fatias (slices)� Listas: operações, slices� Tuplas e sequencias� Comandos input e print� Controle de fluxo: if, while, for� Funções� Dicionários: operações

Curso de Especialização em Redes de Computadores � Inf 514

Plano do Curso: Python

� Entrada/Saída: operações com arquivos� Redirecionamento de Entrada/Saída � Exceções� Módulos� Espaços de nomes � escopo de acesso a objetos� Orientação a Objetos em Python: Classes� Introdução de �10 minutos� a TCP e sockets� O módulo socket de Python - Exemplos� A aplicação Cliente-Servidor serviço de eco� Detalhamento das atividades práticas

Curso de Especialização em Redes de Computadores � Inf 514

Por que Python?� simples e de uso fácil� modo interativo ou 'programado'� disponível em praticamente todas as plataformas

� alto 'poder de expressão'� extensível� farta disponibilidade de bibliotecas de apoio� fácil integração com outros sistemas� uso disseminado

Curso de Especialização em Redes de Computadores � Inf 514

� Modo linha de comando (interativo)Para testes simples como este:

>>> print �Boa tarde!� Boa tarde! >>� Modo edição/execução (preferível)

- num terminal do linux dispare o idle - idle abre janela no modo interativo (Python Shell)- clique em File New Window�- na janela aberta digite e salve seu programa- clique em Run Run Module � para executá-lo

Python: usos do interpretador

Curso de Especialização em Redes de Computadores � Inf 514

Python: conceitos básicos� Expressões simples formadas por:

� variáveis� números� Operadores + - * / �

� Exemplos: #isto é um comentário >>> 45+3*2

51 >>> a = 10.0 # valor 10.0 (tipo float) >>> b = 3 # valor 3 (tipo int) >>> a/b # o resultado é do tipo float

3.3333333333333335

Curso de Especialização em Redes de Computadores � Inf 514

Python: variáveis e atribuições� Atribuição múltipla:

a = b = c = 10 é equivalente a:

a = 10b = 10c = 10

� Variáveis devem ser definidas antes do uso: >>> a = n # n é indefinida

Traceback (most recent call last): File "<pyshell#96>", line 1, in <module> a = n # n é indefinida NameError: name 'n' is not defined >>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: conceitos básicos� A variável '_' mantém o último valor

calculado pelo interpretador. >>> taxa = 12.5 / 100 # 12.5%

>>> valor = 100.50 >>> valor * taxa # juros 12.5625 >>> valor + _ # valor + juros 113.0625 >>> round(_, 2) # arredonda p/ 2 casas 113.06

Curso de Especialização em Redes de Computadores � Inf 514

Python: cadeias (strings)� String: cadeia de caracteres, delimitada

por aspas simples, duplas ou triplas (!) >>> nome = "José"

>>> sobrenome = "Fernandes" >>> print nome,sobrenome José Fernandes >>> nomecompleto = nome +" " +sobrenome >>> print nomecompleto José Fernandes >>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: strings>>> str = "um string \pode ser escrito em \várias linhas">>> print strum string pode ser escrito em várias linhas>>>

Obs: nesse caso, cada linha deve ser terminada pelo caracter �\�

Curso de Especialização em Redes de Computadores � Inf 514

Python: strings

� O caracter �\n�:

>>> str = "uma linha\noutra linha" >>> print str uma linha outra linha >>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: strings� Aspas triplas:

>>> str = """ um string delimitado por aspas triplas pode ocupar várias linhas """ >>> print str um string delimitado por aspas triplas pode ocupar várias linhas >>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: strings� Indexação: cada caracter de um string pode

ser acessado através do seu índice, entre '[ ]'. � Índices de strings sempre começam em zero.� Strings são concatenados via operador '+'� Não podem ser alterados (em C podem)>>> nome = "José"

>>> sobrenome = "Fernandes" >>> iniciais=nome[0]+"."+sobrenome[0]+"." >>> print iniciais J.F. >>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: strings� fatia ou trecho (slice) de um string:

>>> nomeinteiro = "José Fernandes" >>> nome = nomeinteiro[0:4] >>> sobrenome = nomeinteiro[5:14] >>> print nome,"-",sobrenome José - Fernandes >>> � Função len(): obtem tamanho de um string: >>> print len(sobrenome)

9 >>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: Listas

Uma lista é uma sequência de valores delimitada por colchetes '[ ]'.� Exemplo:

>>> primos = [2,3,5,7,11,13,17,19,23,29] >>> primos[7] 19 >>> primos[0:5] [2, 3, 5, 7, 11] >>> len(primos) 10 >>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: Listas

� Outro exemplo: >>> dias = [ 'seg','ter','qua','qui','sex']

>>> dias[0:1]=['sab', 'dom'] >>> dias ['sab','dom', 'seg', 'ter', 'qua', 'qui', 'sex'] Notação alternativa: >>> dias[0:]=['sab', 'dom']

Curso de Especialização em Redes de Computadores � Inf 514

Python: operações com listas >>> p1 = [3,4,5]>>> p1.append(6) # insere 6 ao final da lista

>>> p1[3, 4, 5, 6]>>> p1.insert(0,2) # insere 2 na posição 0>>> p1[2, 3, 4, 5, 6]>>> p1.remove(3) # remove o valor 3>>> p1[2, 4, 5, 6]>>> p1.pop() # remove o último elemento6>>> p1.reverse() # inverte a lista>>> p1[5, 4, 2]

Curso de Especialização em Redes de Computadores � Inf 514

Python: operações com listas Os valores de uma lista:

� podem ser de qualquer tipo� Podem ser de tipos diferentes

Um valor de uma lista pode ser uma lista. Ex.:

>>> pares = [2,4,6,8] >>> impares = [1,3,5,7,9] >>> lista = ['um','dois',pares,'tres',impares] >>> lista ['um', 'dois', [2, 4, 6, 8], 'tres', [1, 3, 5, 7, 9]] >>> Uma tabela pode ser representada como uma lista de listas

Curso de Especialização em Redes de Computadores � Inf 514

Python: Tuplas e sequenciasTupla: uma sequência imutável de valores separados por ',' - pode ser indexada e fatiada como as listas

- em geral definida entre parênteses - pode ser desempacotada numa sequência de variáveis, tendo o efeito de atribuições múltiplas

>>> t = 12345, 54321, �hello!�>>> t[0]12345>>> t(12345, 54321, �hello!�)>>> # Tuplas podem ser aninhadas:... u = t, (1, 2, 3, 4, 5)>>> u((12345, 54321, �hello!�), (1, 2, 3, 4, 5))

Curso de Especialização em Redes de Computadores � Inf 514

Python: Tuplas e sequênciasTuplas vazias ou com um só elemento requerem notação especial:>>> empty = () # declara uma tupla vazia>>> singleton = �hello�, # <-- observe a vírgula extra>>> len(empty)0>>> len(singleton)1>>> singleton(�hello�,)>>>t = (12345, 54321, �hello!�) # empacotamento >>> x, y, z = t #desempacotamnto

Curso de Especialização em Redes de Computadores � Inf 514

Python: um 'programa' simples>>> # Série de Fibonacci>>> a,b = 0,1>>> while b < 100: print b, #observe a vírgula! a,b = b, a+b

1 1 2 3 5 8 13 21 34 55 89>>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: comandos 'input' e 'if'>>> x = input('entre com um valor inteiro:')>>> if x < 0:... print 'x é menor que zero'... elif x == 0:... print 'x é igual a zero'... else:... print 'x é maior que zero'... >>> entre com um valor inteiro: 33x é maior que zero>>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: outro 'programa'- mdc(modo edição/execução)

x = input('entre com o primeiro valor:')y = input('entre com o segundo valor:')while x != y: if x > y: x = x - y else: y = y - xprint 'mdc:',xentre com o primeiro valor:10entre com o segundo valor:35mdc: 5

Curso de Especialização em Redes de Computadores � Inf 514

Python: o comando 'for'O comando for opera sobre qualquer sequência de valores. Um exemplo:

>>> dias = ['seg','ter','qua','qui','sex','sab','dom']>>> for d in dias: print d,dias.index(d),

seg 0 ter 1 qua 2 qui 3 sex 4 sab 5 dom 6>>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: comando 'for': mesmo exemplo, de outra forma

>>> dias = ['seg','ter','qua','qui','sex','sab','dom']>>> for i in range(len(dias)): print i,dias[i],

0 seg 1 ter 2 qua 3 qui 4 sex 5 sab 6 dom>>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: comando 'for': mais exemplos

>>> nome = 'Vasco da Gama'>>> for c in nome: print c,

V a s c o d a G a m a>>> for x in range(10,20): print x,

10 11 12 13 14 15 16 17 18 19>>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: o comando 'break' for n in range(2, 9): for x in range(2, n): if n % x == 0: print n, 'é igual a', x, '*', n/x break else: # (faz parte do 'for') # não achou um fator => o número é primo print n, 'é um número primo'2 é um número primo3 é um número primo4 é igual a 2 * 25 é um número primo6 é igual a 2 * 37 é um número primo8 é igual a 2 * 4

Curso de Especialização em Redes de Computadores � Inf 514

Python: funções>>> # definição de função>>> def fib(n): """ Mostra a série de Fibonacci de 0 a n. """ a, b = 0, 1 while a < n: print a, a, b = b, a+b

>>> # chamada da função>>> fib(1000)0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987>>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: funções : valor de retorno

>>> def fib2(n): """ retorna uma lista contendo a série de Fibonacci de 0 a n. """ res = [] # variável c/ o resultado da função a, b = 0,1 while a < n: res.append(a) # insere no final da lista a, b = b, a+b return res # retorna o resultado>>> # chamada da função>>> fib2(400)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377 ]>>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: funções: outro exemplodef mdc(x,y): while x != y: if x > y: x = x - y else: y = y - x return xdef testamdc(): a = input('entre com o primeiro valor:'); b = input('entre com o segundo valor:'); print 'mdc(',a,',',b,')=',mdc(a,b)>>> testamdc()entre com o primeiro valor: 3443entre com o segundo valor:1234mdc( 3443 , 1234 )= 1

Curso de Especialização em Redes de Computadores � Inf 514

Python: funções: outro exemplodef troca(s, i,j): # troca dois elementos de uma lista s[i], s[j] = s[j], s[i]

def sort(lista): # ordena uma lista for i in range(0,len(lista)-1): for j in range(i,len(lista)): if(lista[i] > lista[j]): troca(lista,i,j)>>> # exemplo de uso>>> lista = ['seg','ter','qua','qui','sex','sab','dom']>>> sort(lista)>>> print lista['dom', 'qua', 'qui', 'sab', 'seg', 'sex', 'ter']

Curso de Especialização em Redes de Computadores � Inf 514

Python: Dicionários� Conjunto não ordenado de pares chave,valor

� Chaves (keys) funcionam como índices

� Chaves são imutáveis (qualquer tipo) e unívocas

� Um dicionário é delimitado pelo par: '{ }'

� Principais operações: Recuperar valor a partir de uma chave Armazenar um valor dada uma chave Alterar um valor dada uma chave existente Recuperar chaves via função keys()

Curso de Especialização em Redes de Computadores � Inf 514

Python: Dicionários: exemplo>>> tel = {�jack�: 4098, �sape�: 4139}>>> tel[�guido�] = 4127>>> tel{�sape�: 4139, �guido�: 4127, �jack�: 4098}>>> tel[�jack�]4098>>> del tel[�sape�]>>> tel[�irv�] = 4127>>> tel{�guido�: 4127, �irv�: 4127, �jack�: 4098}>>> tel.keys()[�guido�, �irv�, �jack�]>>> tel.has_key(�guido�)1>>>tel.values()[4098, 4127, 4127]

Curso de Especialização em Redes de Computadores � Inf 514

Python: Entrada/SaidaOperador de formatação '%':� Permite formatar strings via comando print� Semelhante ao operador '%' da linguagem C: >>> import math # torna acessíveis os objetos do módulo math>>> print ’The value of PI is approximately %5.3f.’ % math.piThe value of PI is approximately 3.142.

Outro exemplo: >>> table = {’Sjoerd’: 4127, ’Jack’: 4098, ’Dcab’: 7678} >>> for name, phone in table.items(): ... print ’%-10s ==> %10d’ % (name, phone) ... Jack ==> 4098 Dcab ==> 7678 Sjoerd 7678 4127

Curso de Especialização em Redes de Computadores � Inf 514

Python: Arquivos - Leitura/Escrita � Sintaxe como na linguagem C� Arquivos no formato Unicode por �default�

>>> f=open('/tmp/workfile', 'w') # vamos criar um arquivo>>> f.write('Essa é a primeira linha do arquivo.\n')>>> f.write('Essa é a segunda linha do arquivo.\n')>>> f.close() # fecha o arquivo para escrita>>> f=open('/tmp/workfile', 'r') # agora abre para leitura>>> f.read() # le e exibe todo o conteúdo do arquivo'Essa \xc3\xa9 a primeira linha do arquivo.\nEssa \xc3\xa9 a segunda linha do arquivo.\n'#não muda de linha nem mostra os caracteres acentuados>>> f.seek(0,0) # volta ao começo do arquivo>>> print(f.read())#print exibe cada linha e caracts acentuadosEssa é a primeira linha do arquivo.Essa é a segunda linha do arquivo.

Curso de Especialização em Redes de Computadores � Inf 514

Python: Arquivos - Leitura/Escrita Outro exemplo

� em vez de ler todo o arquivo, � pode ser conveniente ler uma linha de cada vez� através da função readline():

>>> f=open('/tmp/workfile', 'r') # abre para leitura>>> f.readline() # le e exibe primeira linha 'Essa \xc3\xa9 a primeira linha do arquivo.\n'#Ops: letras acentuadas são armazenadas no formato Unicode>>> print(f.readline())# print converte para Latin-1'Essa é a segunda linha do arquivo.\n'>>> f.readline() # retorna vazio: não há mais linhas''>>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: Arquivos - Leitura/Escrita No exemplo anterior:

� usaremos um laço infinito para ler múltiplas linhas� e a função readline() para ler uma linha de cada vez,� saindo do laço no fim do arquivo via função break():

>>> f=open('/tmp/workfile', 'r') # abre para leitura>>> while(1): # laço infinito

line=f.readline() # lê uma linhaif (not line): # se fim do arquivo,

print('Chegamos ao fim do arquivo')# exibe mensagem break # e sai do laço

print(line) # senão exibe a linha

Essa é a primeira linhaEssa é a segunda linhaChegamos ao fim do arquivo>>>

Curso de Especialização em Redes de Computadores � Inf 514

Python: Arquivos - Leitura/Escrita No exemplo anterior é melhor usar modo edição/execução:

� para isto edite e salve o código a seguir:� (observe a primeira linha para aceitar acentuação)

# -*- coding: utf-8 -*-f=open('/tmp/workfile', 'w') # vamos criar um arquivo em /tmpf.write('Essa é a primeira linha do arquivo.\n')f.write('Essa é a segunda linha do arquivo.\n')f.close() # fecha o arquivo para escritaf=open('/tmp/workfile', 'r') # abre para leiturawhile(1): line=f.readline() if (not line): print('Chegamos ao fim o arquivo') break # sai do laço print(line)

Curso de Especialização em Redes de Computadores � Inf 514

Python: Erros e exceções Erros de sintaxe: são mais simples de visualizar:Exemplo:

>>> while 1 print ’Hello world’File "<stdin>", line 1while 1 print ’Hello world’ ˆSyntaxError: invalid syntax

Obs: faltou ':' após while 1

Curso de Especialização em Redes de Computadores � Inf 514

Exceções:

� erros detetados durante a execução,� não necessariamente fatais,� por isso Python provê um mecanismo para tratá-los.

Exemplo:

>>> 10 * (1/0)Traceback (most recent call last):File "<stdin>", line 1ZeroDivisionError: integer division or modulo

Python: Erros e exceções

Curso de Especialização em Redes de Computadores � Inf 514

Python: Tratamento de exceções Via cláusulas try e except:>>> while 1:...try:...x = int(raw_input("Entre com um número: "))...break...except ValueError:...print "Opa! Esse número não é válido. Tente de novo..."…

Semântica:� A cláusula try (comandos entre try e except ) é executada,� Se não gerar exceção, a cláusula except é ignorada e termina a execução da cláusula try

� Se uma exceção ocorre durante a execução da cláusula try, os comandos remanescentes na cláusula try são ignorados

� Se não houver um tratador except então a exceção passa para um tratador except mais externo, se houver,

� senão a execução termina com uma mensgem de erro

Curso de Especialização em Redes de Computadores � Inf 514

Python: Tratamento de exceções Pode haver várias cláusulas except para tratar tipos distintos de exceções. Exemplo:

import string, systry: f = open(’myfile.txt’) s = f.readline() i = int(string.strip(s))except IOError, (errno, strerror): print "I/O error(%s): %s" % (errno, strerror)except ValueError: print "Could not convert data to an integer."except: print "Unexpected error:", sys.exc_info()[0] raise

Curso de Especialização em Redes de Computadores � Inf 514

Python: Módulos� Arquivo contendo definições e comandos Python� Usualmente contém funções específicas de uma biblioteca: math, os, sys, time

� Incluído num programa através do comando import� Define um espaço de nomes independente do que o importou� Objetos do módulo (por ex. funções) são acessados através da notação '.' : nome_do_módulo.nome_do_objeto Exemplo: sys.stdin.read()

� Onde buscar um módulo no sistema de arquivos? - no diretório corrente

- na lista de diretórios da variável de ambiente PYTHONPATH � Módulos podem ser compilados (para arquivos .pyc, .pyo ) (útil para distribuir código proprietário)

� Função dir(nome_do_módulo) lista os nomes do módulo

Curso de Especialização em Redes de Computadores � Inf 514

Python: Espaço de nomes� Conjunto de nomes visível num determinado escopo� Escopo é uma região textual de um programa onde um espaço de nomes é diretamente acessível (parece definição circular mas não é!)

� Exemplo: os nomes definidos num módulo� Nomes definidos em espaços distintos são independentes, (o que evita conflitos) e são acessados via notação '.'

� 3 escopos diretamente acessíveis na execução do programa: - escopo interno (nomes definidos no corpo de uma função) - escopo global : são os nomes do módulo (programa) - escopo externo: são os nomes pre-definidos pelo interpretador a busca de nomes durante a execução segue a ordem acima

� Para acessar uma variável global dentro de uma função use no corpo da função a cláusula: global nome_variável

Curso de Especialização em Redes de Computadores � Inf 514

Python: Orientação a Objetos: ClassesDefinição de classe:

class nome_classe(): <comando-1> (usualmente definição de uma função) . . . <comando-n>

A definição cria um novo espaço de nomes:

class MyClass:"""Um exemplo simples de classe"""i = 12345def f(self): return �hello world�

Curso de Especialização em Redes de Computadores � Inf 514

Python: Orientação a Objetos: ClassesAtributos de uma classe são de dois tipos:� Dados (no exemplo anterior: i )�Métodos (funções) (no exemplo anterior: f()Instanciação de uma classe: x = Myclass()� Cria uma instancia e atribui o objeto classe criado à variável x

Dados de uma classe podem ser dinamicamente criados: Exemplo: x.counter = 1

Invocando um metodo (função) de uma classe:

x.f() exibirá a cadeia hello world

Curso de Especialização em Redes de Computadores � Inf 514

Python: Orientação a Objetos: Classes

O método __init__( ) permite inicializar objetos da classe:Exemplo:

>>> class Complex: � def __init__(self, realpart, imagpart): � self.r = realpart � self.i = imagpart ... >>> x = Complex(3.0, -4.5) # instancia com valores iniciais >>> x.r, x.i (3.0, -4.5

Curso de Especialização em Redes de Computadores � Inf 514

Python: Classes - HerançaPython suporta herança simples e múltipla

Class DerivedClassName(BaseClassName): <comando-1> . . . <comando-n>

O nome BaseClassName deve ser acessivel (estar no escopo) do código onde aparece a definição da classe derivada, podendo também estar definido num módulo:

Class DerivedClassName(MouleName.BaseClassName): <comando-1> . . . <comando-n>