def atualizaAPI(notificaSocket): i = 0 global notificacoes while condicao == True: #Recebe empty ou continue mensagem = recv_msg(notificaSocket) if mensagem == 'Empty': continue #else(recebeu a lista das notificaoes) if mensagem == 'Nothing changed': pass else: #Este try/except serve para quando o socket e fechado(opcao SAIR) no servidor nao dar erro de NoType. Simplesmente ignora os erros. try: #juntar as notificacoes, ordenar e selecionar apenas os elementos unicos listaNoti = list(mensagem.split(" ")) novasNotificacoes = notificacoes novasNotificacoes.extend(listaNoti) notificacoes = novasNotificacoes notificacoes = list(set(notificacoes)) notificacoes.sort() except: pass #Da o 'OK' ao servidor send_msg(notificaSocket, 'Keep') return
def login(c, notificaSocket, Num_cliente): tentativas = 2 while tentativas >= 0: ID = recv_msg(c) i = verificaID(ID) if i != False: send_msg(c, 'Success') return i else: str(tentativas) send_msg(c, str(tentativas)) tentativas -= 1 print Num_cliente, curr_time(), 'Numero maximo de tentativas excedido!' #Caso o cliente exceda o numero maximo de tentativas(3), entao termina a sua thread de servidor terminate(c, notificaSocket)
def login(s): print 'Bem-vindo ao servidor de privacidade ISABELA' #so para inicializar ID = 'a' #Obtem o ID que o utilizador introduz, envia-o para o servidor ver se e valido, recebe a resposta do utilizador e avalia se continua a perguntar ou nao while True: ID = raw_input('Introduza o seu ID: ') send_msg(s, ID) result = recv_msg(s) if result == 'Success': return ID else: result = int(result) if result != 0: print 'Introduza um ID existente. Tem', result, 'tentativas' else: print 'Numero maximo de tentativas atingido! Terminando o cliente...' result = int(result) if result == 0: s.close sys.exit(0)
def main(s, notificaSocket): ID = login(s) print "Login bem sucedido!" #Cria a thread para atualizar a API try: Thread(target=atualizaAPI, args=(notificaSocket, )).start() except: print "Erro ao iniciar a thread para atualizar!" sys.exit() #Ciclo principal while True: #Para nao haver conflito de envio de dados time.sleep(0.001) #Recebe as subscricoes para depois as impirmir subscricoes = recv_msg(s) subscricoes = list(subscricoes.split(" ")) if subscricoes == ['']: subscricoes = [] opcao = menu() #Verifica qual a opcao escolhida e executa a sua funcao if opcao == 1: opcao_menu_op1 = menu_op('opcao1') if opcao_menu_op1 == 11: continue #else #Receber o dado pedido print 'Valor = ', recv_msg(s) raw_input('\n[Introduza qualquer coisa para continuar]') elif opcao == 2: for i in range(11): print recv_msg(s) raw_input('\n[Introduza qualquer coisa para continuar]') elif opcao == 3: opcao_menu_op3 = menu_op('opcao3') if opcao_menu_op3 == 10: continue #else #Receber o dado pedido print 'Media = ', recv_msg(s) raw_input('\n[Introduza qualquer coisa para continuar]') elif opcao == 4: for i in range(10): print recv_msg(s) raw_input('\n[Introduza qualquer coisa para continuar]') elif opcao == 5: #Listar subscricoes e obter a opcao selecionada opcao_sub = menu_sub(subscricoes) if opcao_sub == 7: continue elif opcao_sub == 1: sub = menu_op('opcao5.1') if sub == 10: continue #else print 'Subscricao criada com sucesso!' raw_input('\n[Introduza qualquer coisa para continuar]') elif opcao_sub == 2: sub = menu_op('opcao5.2') if sub == 10: continue #else print 'Subscricao criada com sucesso!' raw_input('\n[Introduza qualquer coisa para continuar]') elif opcao_sub == 3: maximo = printSubs(subscricoes, 1) #Nao existe nenhuma subscricao if maximo == -1: raw_input('\n[Introduza qualquer coisa para continuar]') continue #else print '\n' if verifica_valor(1, maximo) == maximo: send_msg(s, 'Voltar') continue #else #enviar o parametro a remover indiceElementoRemover = maximo - 2 send_msg(s, str(indiceElementoRemover)) elif opcao_sub == 4: print 'Subscricoes individuais efetuadas com sucesso!' raw_input('\n[Introduza qualquer coisa para continuar]') elif opcao_sub == 5: print 'Subscricoes de grupo efetuadas com sucesso!' raw_input('\n[Introduza qualquer coisa para continuar]') elif opcao_sub == 6: print 'Todas as subscricoes foram removidas com sucesso!' raw_input('\n[Introduza qualquer coisa para continuar]') elif opcao == 6: global notificaoes del notificacoes[:] elif opcao == 7: global condicao #Terminar a Thread que atualiza a API condicao = False s.close notificaSocket.close sys.exit(0)
def main(c, notificaSocket, Num_cliente): global utilizadores global subscricoes #Este e o indice do ID no array index_ID = login(c, notificaSocket, Num_cliente) print Num_cliente, curr_time(), 'Login bem sucedido!' #Cria a Thread que atualiza a API try: Thread(target=atulizaAPI, args=(notificaSocket, index_ID)).start() except: print "Erro ao iniciar a thread para atualizar!" sys.exit() while True: #Arranjar o array das subscricoes e enviar para o cliente auxSet = set(subscricoes) subscricoes = list(auxSet) subscricoes.sort() enviaSubs = ' '.join(subscricoes) send_msg(c, enviaSubs) #Obter a opcao selecionada pelo cliente mensagem = recv_msg(c) mensagem = int(mensagem) if mensagem == 1: print Num_cliente, curr_time( ), 'Opcao 1. (ver uma das minhas informacoes) selecionada' #Receber a opcao do outro menu mensagem = recv_msg(c) mensagem = int(mensagem) if mensagem == 11: print Num_cliente, curr_time( ), 'Opcao 1.11. (voltar) selecionada' continue #else print Num_cliente, curr_time(), 'Opcao 1.%d selecionada' % mensagem key = num_to_key(mensagem) result = search_key(key, index_ID) if result == 'ERROR': print Num_cliente, 'Ocorreu um ERRO!' c.close # Close connection sys.exit(0) #Enviar os dados send_msg(c, str(result)) elif mensagem == 2: print Num_cliente, curr_time( ), 'Opcao 2. (ver todas as minhas informacoes) selecionada' for key, value in data[index_ID].items(): mensagem = '%s = %s' % (key, value) send_msg(c, mensagem) #Para nao haver conflito de envio de dados time.sleep(0.001) elif mensagem == 3: print Num_cliente, curr_time( ), 'Opcao 3. (ver a media de uma das informacoes do grupo) selecionada' #Receber a opcao do outro menu mensagem = recv_msg(c) mensagem = int(mensagem) if mensagem == 10: print Num_cliente, curr_time( ), 'Opcao 3.11. (voltar) selecionada' continue #else print Num_cliente, curr_time( ), 'Opcao 3.%d.. selecionada' % mensagem key = num_to_key(mensagem) #Temos o parametro que queremos a media, agora calcular a media med = media(key) #Enviar a media para o cliente send_msg(c, str(med)) elif mensagem == 4: print Num_cliente, curr_time( ), 'Opcao 4. (ver a media de todas das informacoes do grupo) selecionada' #Pegar num id qualquer qualquer(porque todos tem todos os parametros) for key, value in data[index_ID].items(): if key == 'id': break med = media(key) mensagem = '%s = %s' % (key, med) send_msg(c, mensagem) #Para nao haver conflito de envio de dados time.sleep(0.001) elif mensagem == 5: print Num_cliente, curr_time( ), 'Opcao 5. (subscricoes) selecionada' #Recebe a opcao do menu das subscricoes sub = recv_msg(c) sub = int(sub[0]) if sub == 7: print Num_cliente, curr_time( ), 'Opcao 5.7. (voltar) selecionada' continue elif sub == 1: print Num_cliente, curr_time( ), 'Opcao 5.1. (criar subscricao individual) selecionada' #Recebe qual a subscricao individual a fazer sub2 = recv_msg(c) sub2 = int(sub2) if sub2 == 10: print Num_cliente, curr_time( ), 'Opcao 5.1.10. (voltar) selecionada' continue #else #Formata para colocar no array subNo = "1.%d" % sub2 subscricoes.append(subNo) print Num_cliente, curr_time( ), 'Subscricao individual criada para', num_to_key(sub2) elif sub == 2: print Num_cliente, curr_time( ), 'Opcao 5.2. (criar subscricao de grupo) selecionada' #Recebe qual a subscricao de grupo a fazer sub2 = recv_msg(c) sub2 = int(sub2) if sub2 == 10: print Num_cliente, curr_time( ), 'Opcao 5.2.10. (voltar) selecionada' continue #Formata para colocar no array subNo = "2.%d" % sub2 if subNo not in subscricoes: subscricoes.append(subNo) print Num_cliente, curr_time( ), 'Subscricao de grupo criada para', num_to_key(sub2) elif sub == 3: print Num_cliente, curr_time( ), 'Opcao 5.3. (remover subscricao) selecionada' if not subscricoes: continue #Recebe o elemento a remover elementoRemover = recv_msg(c) if elementoRemover == 'Voltar': print Num_cliente, curr_time( ), 'Opcao 5.3.4. (voltar) selecionada)' continue elementoRemover = int(elementoRemover) #Remove o elemento escolhido del subscricoes[elementoRemover] elif sub == 4: print Num_cliente, curr_time( ), 'Opcao 5.4. (subscrever todos os parametros individuais) selecionada' subsIndividuais = [ '1.1', '1.2', '1.3', '1.4', '1.5', '1.6', '1.7', '1.8', '1.9' ] subscricoes.extend(subsIndividuais) elif sub == 5: print Num_cliente, curr_time( ), 'Opcao 5.5. (subscrever todos os parametros de grupo) selecionada' subsGrupo = [ '2.1', '2.2', '2.3', '2.4', '2.5', '2.6', '2.7', '2.8', '2.9' ] subscricoes.extend(subsGrupo) elif sub == 6: print Num_cliente, curr_time( ), 'Opcao 5.6. (remover todas as subscricoes) selecionada' del subscricoes[:] elif mensagem == 6: print Num_cliente, curr_time( ), 'Opcao 6. (limpar notificacoes) selecionada' continue elif mensagem == 7: print Num_cliente, curr_time(), 'Cliente saiu' terminate(c, notificaSocket)
def atulizaAPI(notificaSocket, index_ID): global data while condicao == True: if not subscricoes: send_msg(notificaSocket, 'Empty') continue #Recebe a API #url = "http://10.3.4.75:9014/v2/entities?options=keyValues&type=student&attrs=activity,calls_duration,calls_made,calls_missed,calls_received,department,location,sms_received,sms_sent" url = "http://socialiteorion2.dei.uc.pt:9014/v2/entities?options=keyValues&type=student&attrs=activity,calls_duration,calls_made,calls_missed,calls_received,department,location,sms_received,sms_sent&limit=100" headers = { 'cache-control': "no-cache", "fiware-servicepath": "/", "fiware-service": "socialite" } r = requests.get(url, headers=headers) newData = r.json() lista = [] #Notificacoes individuais if data[index_ID] != newData[index_ID]: #Obtemos as keys dos paramentros alterados diferenca = DictDiffer(newData[index_ID], data[index_ID]) for e in diferenca: #Transformar a key em valor num = key_to_num(str(e)) #Formatar para a nossa lista de notificacoes e adicionar o elemento notificao = "1.%d" % num lista.append(notificao) #Notificacoes de grupo for i in range(len(data)): #Obtemos as keys dos paramentros alterados diferenca = DictDiffer(newData[i], data[i]) for e in diferenca: num = key_to_num(str(e)) #Formatar para a nossa lista de notificacoes e adicionar o elemento notificao = "2.%d" % num lista.append(notificao) #Deepcopy para alterar o valor data = copy.deepcopy(newData) #Ver quais os elementos em comum da lista das subscricoes e notificacoes comuns = list(set(lista) & set(subscricoes)) comuns_enviar = ' '.join(comuns) #Enviar para o cliente a lista das notificacoes if comuns_enviar == '': send_msg(notificaSocket, 'Nothing changed') #se tiver alguma coisa else: send_msg(notificaSocket, comuns_enviar) control = recv_msg(notificaSocket) if control == 'Stop': notificaSocket.close() sys.exit() #else(Keep) continua a executar #Indica de quanto em quanto tempo a API vai ser alterada time.sleep(tempo) return