S
In case option 2 your function was not returning anything, you should return or the error happens, besides being badly positioned.You weren't sending as a response to the client in bytes:AttributeError: 'NoneType' object has on attribute 'encode'Code with the problem fixed:Server:import socket, psutil
def mostra_uso_ram():
mem = psutil.virtual_memory()
text = '\nMemoria Total: {}'.format(mem.total/(102410241024))
text += '\nMemoria Usada: {}'.format(mem.used/(102410241024))
return text
Cria o socket
socket_servidor = socket.socket()
socket_servidor.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
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))
#terminou = False
while True:
info = ("\n 1 - Uso de Processamento \n 2 - Memoria \n 3- Arquivos e Diretórios\n 4 -Processos Ativos \n 5- Redes \n Pressione $ para encerrar a conexão")
socket_cliente.send(info.encode('utf-8')) # Envia resposta
msg = socket_cliente.recv(1024)
print(msg)
if '$' == msg.decode('utf-8'): #Termino do cliente
info = ('Conexão encerrada')
socket_cliente.send(info.encode('utf-8')) # Envia mensagem
print("Fechando conexao com", str(addr), "...")
socket_cliente.close()
break
if '1' == msg.decode('utf-8'):
info1 =('Usuario solicitou Informações de uso de processamento')
socket_cliente.send(info1.encode('utf-8')) # Envia mensagem
print(info1)
break
if '2' == msg.decode('UTF-8'):
info2 = ('Usuario solicitou Informações sobre Memoria')
mem = mostra_uso_ram()
socket_cliente.send(mem.encode('utf-8')) # Envia mensagem
print(info2, mem)
break
if '3' == msg.decode('UTF-8'):
info3 = ('Usuario solicitou Informações sobre arquivos e diretorios')
socket_cliente.send(info3.encode('utf-8')) # Envia mensagem
print(info3)
break
if '4' == msg.decode('UTF-8'):
info3 = ('Usuario solicitou Informações sobre processos ativos')
socket_cliente.send(info3.encode('utf-8')) # Envia mensagem
print(info3)
break
if '5' == msg.decode('UTF-8'):
info3 = ('Usuario solicitou Informações sobre Rede')
socket_cliente.send(info3.encode('utf-8')) # Envia mensagem
print(info3)
break
else:
dif =('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('O usuário Digitou opções invalidas.')
break
CLiente:import socket, psutil
host = socket.gethostname()
porta = 9999
Cria o socket
s = socket.socket()
try:
Tenta se conectar ao servidor
s.connect((host, porta))
except Exception as erro:
print(str(erro))
print('Conexão efetuada com',host)
#Recebe informações disponiveis
msg = s.recv(1024)
print(msg.decode('utf-8'))
while True:
#Aguarda usuario digitar opção para monitorar
menu = input('Digite a opção que deseja monitorar:')
s.send(menu.encode('utf-8')) #Envia opção escolhida pelo usuario
#recebe informações
info = s.recv(1024)
print(info.decode())
Other versionWhen playing a little with your code, I think I could improve and increase scalability:Server:import socket, psutil
def mostra_uso_ram(socket_cliente):
mem = psutil.virtual_memory()
info = '\nMemoria Total: {}'.format(mem.total/(102410241024))
info += '\nMemoria Usada: {}'.format(mem.used/(102410241024))
socket_cliente.send(info.encode('utf-8'))
def uso_process(socket_cliente):
info = '\nUsuario solicitou Informações de uso de processamento'
socket_cliente.send(info.encode('utf-8'))
def close_conn(socket_cliente):
socket_cliente.shutdown(socket.SHUT_RDWR)
socket_cliente.close()
def arqui_dirs(socket_cliente):
info = '\nUsuario solicitou Informações sobre arquivos e diretorios'
socket_cliente.send(info.encode('utf-8')) # Envia mensagem
def active_procc(socket_cliente):
info = '\nUsuario solicitou Informações sobre processos ativos'
socket_cliente.send(info.encode('utf-8')) # Envia mensagem
def network(socket_cliente):
info = '\nUsuario solicitou Informações sobre Rede'
socket_cliente.send(info.encode('utf-8')) # Envia mensagem
opts = {
'$': ('pressione $ para disconectar-se', close_conn),
'1': ('Uso de Processamento', uso_process),
'2': ('Memoria', mostra_uso_ram),
'3': ('Arquivos e Diretórios', arqui_dirs),
'4': ('Processos Ativos', active_procc),
'5': ('Redes', network),
}
menu_text = '\n'
for opt, (opt_text, func) in sorted(opts.items()):
menu_text += '\n{} - {}'.format(opt, opt_text)
Cria o socket
socket_servidor = socket.socket()
socket_servidor.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
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))
socket_cliente.send(menu_text.encode())
while True:
# Decodifica mensagem em UTF-8:
try:
msg = socket_cliente.recv(1024).decode()
except Exception as err:
break
if(msg == '$'):
close_conn(socket_cliente)
break
elif(msg not in opts):
socket_cliente.send('Opção inválida'.encode())
else:
opts[msg]1
socket_cliente.send(menu_text.encode())
Client:import socket, psutil
host = socket.gethostname()
porta = 9999
Cria o socket
s = socket.socket()
try:
Tenta se conectar ao servidor
s.connect((host, porta))
except Exception as erro:
print(str(erro))
print('Conexão efetuada com',host)
#Recebe informações disponiveis
msg = s.recv(1024)
print(msg.decode('utf-8'))
while True:
#Aguarda usuario digitar opção para monitorar
menu = input('Digite a opção que deseja monitorar:')
s.send(menu.encode('utf-8')) #Envia opção escolhida pelo usuario
#recebe informações
info = s.recv(1024)
print(info.decode())