Send Functions using pickle and use LOOP

0

We are developing an application with client-server structure using the socket and pickle library, we need a loop that continuously sends the data to the client using the pickle to compress the data of the functions and send. but the loop only works once and then terminates the connection with error. Every time we send the option we need the data to be compressed and sent using the pickle inside the loop.

código Servidor:

import socket, psutil, pickle, os, time
from turtledemo.paint import switchupdown


def mostra_uso_cpu_e_ram(socket_cliente):
    info1 =('Usuario solicitou Informações de uso de processamento e Memória')
    # Gera a lista de resposta
    resposta = []
    resposta.append(psutil.cpu_percent())
    mem = psutil.virtual_memory()
    mem_percent = mem.used/mem.total
    resposta.append(mem_percent)
    # Prepara a lista para o envio
    bytes_resp = pickle.dumps(resposta)
    # Envia os dados
    socket_cliente.send(bytes_resp) # Envia mensagem
    print(info1)


def arquivos_diretorios(socket_cliente):
    info2 = ('\nUsuario solicitou Informações sobre processos ativos')
    socket_cliente.send(info2.encode('utf-8'))
    #obtém lista de arquivos e diretórios
    lista = os.listdir()
    #Cria um dicionário
    dic = []#{}
    for i in lista: #varia na lista dos arquivos e diretórios
        if os.path.isfile(i):#checa se é um arquivo
            dic[i] = []
            dic[i].append(os.stat(i).st_size)#tamanho
            dic[i].append(os.stat(i).st_atime)#tempo de criação
            dic[i].append(os.stat(i).st_mtime)#Tempo de Modificação
    titulo = '{:11}'.format("Tamanho") # 10 caracteres + 1 de espaço
    # Concatenar com 25 caracteres + 2 de espaços
    titulo = titulo + '{:27}'.format("Data de Modificação")
    # Concatenar com 25 caracteres + 2 de espaços
    titulo = titulo + '{:27}'.format("Data de Criação")
    titulo = titulo + "Nome"
    print(titulo)
    for i in dic:
        kb = dic[i][0]/1000
        tamanho = '{:10}'.format(str('{:.2f}'.format(kb)+' KB'))
        print(tamanho, time.ctime(dic[i][2]), " ", time.ctime(dic[i][1]), " ", i)
    print(info2)

def processos_ativos(socket_cliente):
    info3 = ('\nUsuario solicitou Informações sobre processos ativos')
    socket_cliente.send(info.encode('utf-8')) # Envia mensagem

def informacoes_redes(socket_cliente):
    info4 = ('\nUsuario solicitou Informações sobre Rede')
    socket_cliente.send(info.encode('utf-8')) # Envia mensagem

def sair_da_conexao(socket_cliente):
    info = ('Conexão Encerrada!')
    socket_cliente.send(info.encode('urf-8'))
    print("Fechando Conexão com", str(addr), "...")
    socket_cliente.shutdown(socket.SHUT_RDWR)
    socket_cliente.close()

# Cria o socket
socket_servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Obtem o nome da máquina
host = socket.gethostname()
porta = 9999
# Associa a porta
socket_servidor.bind((host, porta))
# Escutando...
socket_servidor.listen()
print("Servidor", host, "esperando conexão na porta", porta)
# Aceita alguma conexão
(socket_cliente,addr) = socket_servidor.accept()
print("Conectado a:", str(addr))




while True:
    info = ("\n ====================MENU======================="
            "\n 1 - Uso de Processamento e Memória "
            "\n 2- Arquivos e Diretórios "
            "\n 3 -Processos Ativos "
            "\n 4- Redes "
            "\n 5- Sair"
            "\n ==============================================")
    socket_cliente.send(info.encode('utf-8')) # Envia resposta
    # Decodifica mensagem em UTF-8:
    msg = socket_cliente.recv(1024)
    if '1' == msg.decode('utf-8'):
        mostra_uso_cpu_e_ram(socket_cliente)

    if '2' == msg.decode('UTF-8'):
        arquivos_diretorios(socket_cliente)

    if '3' == msg.decode('UTF-8'):
        processos_ativos(socket_cliente)

    if '4' == msg.decode('UTF-8'):
        informacoes_redes(socket_cliente)

    if '5' == msg.decode('utf-8'): #Termino do cliente
        sair_da_conexao(socket_cliente)
        break
    else:
        print('O usuário Digitou opções invalidas.')
        #socket_cliente.send(dif.encode('utf-8')) # Envia resposta
        #socket_cliente.send(info.encode('utf-8')) # Envia resposta
        #print(dif)
        #break



Código Cliente
import socket, time, pickle

# Função que imprime a lista formatada
def imprime(l):
    texto = ''
    for i in l:
        texto = texto + '{:>8.2f}'.format(i)
    print(texto)

# Cria o socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Tenta se conectar ao servidor
s.connect((socket.gethostname(), 9999))


menu = s.recv(1024)
#print(menu.decode(' utf-8'))
while True:
    #menu = s.recv(1024)
    print(menu.decode(' utf-8'))
    msg1 = input('digite a opção desejada: ')
    if msg1 == '1':
        s.send(msg1.encode('UTF-8'))
        msg = ' '
        print('{:>8}'.format('%CPU')+'{:>8}'.format('%MEM'))
        # Envia mensagem vazia apenas para indicar a requisição
        s.send(msg.encode('ascii'))
        bytes = s.recv(1024)
        # Converte os bytes para lista
        lista = pickle.loads(bytes)
        imprime(lista)
        time.sleep(2)
    elif msg1 == '2':
        print('Legal')
    elif msg1 == '3':
        print('udaue')
    elif msg1 == '4':
        print('asdsad')
    else:
        print('foda-se')

#input("Pressione qualquer tecla para sair...")
    
asked by anonymous 19.09.2017 / 16:36

0 answers