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...")