Sending data from Server to Client (LOCAL)

1

I need to send data from a server function to the client using the socket library but when sending the information to the client they arrive in white, the variable that receives the functions it prints the contents on the server but on the client the data arrives empty.

Server Code

    import socket, psutil
    # 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))


#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
    # Decodifica mensagem em UTF-8:
    msg = socket_cliente.recv(1024)
    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')
        def mostra_uso_ram():
            mem = psutil.virtual_memory()
            print('Memoria Total',mem.total/(1024*1024*1024))
            print('Memoria Usada',mem.used/(1024*1024*1024))
        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

Customer Code     # Client     import socket, sys

host = socket.gethostname()
porta = 9999

# Cria o socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
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(str('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)
    
asked by anonymous 06.09.2017 / 15:47

1 answer

0

In case of being option 2 your function was not returning anything, you should return or the error happens, besides being poorly positioned.

Also you were not sending as a response to the client in bytes :

  

AttributeError: 'NoneType' object has no attribute 'encode'

Code with problem fixed:

Server:

import socket, psutil

def mostra_uso_ram():
    mem = psutil.virtual_memory()
    text = '\nMemoria Total: {}'.format(mem.total/(1024*1024*1024))
    text += '\nMemoria Usada: {}'.format(mem.used/(1024*1024*1024))
    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

Customer:

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())



Another version

By playing around with your code I think I was able to improve and increase the scalability:

Server:

import socket, psutil

def mostra_uso_ram(socket_cliente):
    mem = psutil.virtual_memory()
    info = '\nMemoria Total: {}'.format(mem.total/(1024*1024*1024))
    info += '\nMemoria Usada: {}'.format(mem.used/(1024*1024*1024))
    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)
    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())
    
06.09.2017 / 16:14