Sending Server Data to Client (LOCAL)

Asked

Viewed 1,623 times

1

I have the need to send data from a server function to the client using the library socket but when sending the information to the client they arrive blank, the variable that receives the functions prints the content on the server but in 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

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

1 answer

0

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

You also weren’t sending as an answer to the customer at bytes:

Attributeerror: 'Nonetype' Object has no attribute 'Encode'

Code with fixed problem:

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

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



Other version

Playing a little with your code I think I’ve managed 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())

Browser other questions tagged

You are not signed in. Login or sign up in order to post.