COMPUTAÇÃO DISTRIBUIDA CHEATSHEET (PYTHON) Última atualização a 15/01/2020 Esperar por ligação, criando nova socket qnd há uma (clientsocket, address) = serversocket.accept() Por defeito as sockets estão em modo de bloqueio. clientsocket.setBlocking(1) Sockets https://docs.python.org/3/library/socket.html import socket Estabelecem a comunicação entre dois processos, na mesma ou em máquinas diferentes. Podem ser distinguidas em dois grandes grupos, as sockets do cliente, que atuam como extremo da comunicação e as sockets do servidor, que funcionam como operadores de distribuição. As trocas de mensagens são realizadas utilizando os protocolos UDP ou TCP. Uma socket em modo non-blocking (0) caso numa chamada à função recv() não receba nenhuma informação ou send() não consiga enviar, gera um erro. Em modo de bloqueio (1), nestes cenários a socket bloqueia até que hajam condições para executar as funções referidas. JSON https://docs.python.org/3/library/json.html import json Objeto em JSON é dicionário em Python e array em JSON é array em Python. Selectors https://docs.python.org/3/library/selectors.html import selectors Permitem multiplexagem1 de I/O eficiente. CONSTANTES EVENT_READ EVENT_WRITE Criar seletor sel = selectors.DefaultSelector() Executar uma função quando um evento ocorre numa socket. sel.register(<socket>, <event>, <function>) Converte dados em python para string JSON Cliente Criação da socket, indicando família e protocolo s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) Conexão ao servidor, na porta 80 s.connect(("www.python.org", 80)) Receção e envio de dados para o servidor s.recv(<int-maxBytes>)/sendall(<bytes-data>) A informação é trocada na forma de bytes, pelo que as operações de encode() e decode() são fundamentais. Sob strings, por defeito a codificação é feita em ‘utf-8’, que pode ser passado como argumento das funções referidas. Servidor serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) json.dumps(<pythonObject>) Converte string JSON para dados em Python json.loads(<string>) while True: Bloqueia processo até que ocorra um evento events = sel.select() for key, mask in events: key.data é a função definida como terceiro parâmetro no register callback = key.data file.obj é o primeiro parâmetro no register. A mask não importa agora. callback(key.fileobj, mask) Com os selectors, conseguimos fazer do seervidor um mero intermediário, responsável por criar sockets de cliente em resposta a um pedido de uma socket de cliente, não tendo qualquer papel na troca de dados entre o cliente e o servidor. Definir endereço da socket e respetiva porta serversocket.bind((socket.gethostname(), 80)) Definir fila de espera de ligações (número de ligações acumuladas em espera antes de começar a recusar novas ligações) serversocket.listen(5) Com a socket (“servidor”) configurada, podemos entrar no main loop while True: 1 Técnica que permite trocar várias mensagens de origens ou destinos diferentes numa única via. Gonçalo Matos, 92972, LEI