#!/usr/bin/env python ''' server.py: Um servidor UDP concorrente para stream de audio. Captura áudio de um microfone e envia stream de pacotes UDP para clientes. Espera a mensagem de um cliente e cria um subprocesso para atendê-lo. ''' __authors__ = "Eduardo H. Trevisan, Gabriela Stein" __date__ = "2019-06-07" __email__ = "eht17@inf.ufpr.br" __status__ = "Production" import socket import sys import time import getopt import alsaaudio import pickle import signal # Signal handling import os import datetime # Numero de sequencia das mensagens seq = 1 def usage(): print('uso: server.py [-d ] [-i ] [-a
] [-p ]', file=sys.stderr) sys.exit(2) def signal_handler(signal, frame): print() if(seq == 1): print(datetime.datetime.now()) print("Encerrando processos...") else: print(str(os.getpid()) + ":" + " Numero de mensagens enviadas: " + str(seq)) sys.exit(0) def child(interval): '''Subprocesso que realiza stream com um cliente''' global seq # Numero de sequencia das mensagens # Abrir dispositivo de entrada inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NONBLOCK, device=device) # Atributos: Mono, 44100 Hz, 16 bit little endian samples inp.setchannels(1) inp.setrate(44100) inp.setformat(alsaaudio.PCM_FORMAT_S16_LE) # Numero de frames por periodo inp.setperiodsize(160) print(datetime.datetime.now()) print(str(os.getpid()) + ":" + " Enviando mensagens...\n") while True: # Ler dados do dispositivo l, data = inp.read() # Construir mensagem msg = (seq, l, data) # Enviando dados para o cliente if l: bytesToSend = pickle.dumps(msg) UDPServerSocket.sendto(bytesToSend, address) seq += 1 time.sleep(interval) if __name__ == '__main__': device = 'default' interval = 0.0 localIP = "127.0.0.1" localPort = 20001 bufferSize = 1024 opts, args = getopt.getopt(sys.argv[1:], 'd:i:a:p:h') for o, a in opts: if o == '-d': device = a elif o == '-i': interval = float(a) elif o == '-a': localIP = a elif o == '-p': localPort = a elif o == '-h': usage() # Signal handler para encerrar o servidor com ctrl c signal.signal(signal.SIGINT, signal_handler) # Criar um socket UDP para o server UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM) # Bind UDPServerSocket.bind((localIP, localPort)) print(datetime.datetime.now()) print("Servidor inicializado\n") while True: # Esperando conexao com o cliente bytesAddressPair = UDPServerSocket.recvfrom(bufferSize) address = bytesAddressPair[1] clientIP = "Novo cliente!\nIP:{}".format(address) print(datetime.datetime.now()) print(clientIP) # Conexão estabelecida # Criando um subprocesso para se comunicar com o cliente print("Criando novo processo...") newpid = os.fork() if newpid == 0: child(interval) else: pids = (os.getpid(), newpid) print("pai: %d, filho: %d\n" % pids)