Как отправить данные конкретному клиенту при обработке многопользовательской арки. использование asyncio python и модуля сокетов - PullRequest
0 голосов
/ 17 октября 2019

Я занимаюсь разработкой веб-приложения, которое будет закрывать данные с нескольких удаленных серверов и показывать их на веб-странице, и в то же время я хочу запускать команды на выбранных удаленных системах. Я рассмотрел эту часть для извлечения данных с удаленных серверов. используя python asyncio, сокет, но застрял там, где мне нужно отправить данные выбранным клиентам. Нужны идеи и помощь.

Примечание ** использование колбы для разработки интерфейса.

---------server.py---------


from socket import *
import asyncio,pickle

all_connections = []
all_addresses = []

async def echo_server(address, loop):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.bind(address)
    sock.listen(1)
    sock.setblocking(False)
    for c in all_connections:
        c.close()
    del all_connections[:]
    del all_addresses[:]
    while True:
        # client,addr=sock.accept()
        client, addr = await loop.sock_accept(sock)
        all_connections.append(client)
        all_addresses.append(address)
        print('connection from', all_addresses[0])
        loop.create_task(get_data(client, loop))

async def get_data(client, loop):
    while True:

        data = await loop.sock_recv(client, 1024)
        data=pickle.loads(data)
        if not data:
            break

        print('recived data is ',data)

    print('connection closing ')
    client.close()
    print('Connection Closed')

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(echo_server(('', 25000), loop))

------------client.py---------

from socket import *
import asyncio,time,pickle,psutil,pythoncom,wmi
from datetime import datetime, timedelta


async def echo_client(address,loop):
    try:
        sock = socket(AF_INET, SOCK_STREAM)
        sock.connect(address)
        sock.setblocking(False)
    except ConnectionRefusedError:
        print('retryinig to connect')
        connected = False
        while not connected:
            try:
                sock.connect(address)
                sock.setblocking(False)
                connected=True

            except ConnectionRefusedError:
                time.sleep(2)
    while True:

        system_data=get_data()
        data=pickle.dumps(system_data)
        try:
            await loop.sock_sendall(sock,data)
        except ConnectionResetError:
            connected=False
            sock = socket(AF_INET, SOCK_STREAM)
            while not connected:
                try:
                    print('connection lost Retrying to send data')
                    sock.connect(address)
                    sock.setblocking(False)
                    await loop.sock_sendall(sock, data)                    
                    connected=True
                except ConnectionRefusedError:
                    time.sleep(5)



    sock.close()

def get_data():
    system_data = {"HostName": "null", "UpTime": "null", "CPU": "null"}
    host_name = gethostname()
    system_data["HostName"] = host_name
    cpu_utilization = psutil.cpu_percent(interval=5)
    system_data["CPU"] = cpu_utilization
    pythoncom.CoInitialize()
    c = wmi.WMI()
    for os in c.Win32_OperatingSystem():
        time = os.LastBootUpTime.split('.')[0]
        last_boot_time = datetime.strptime(time, '%Y%m%d%I%M%S')
        system_data["UpTime"] = str(last_boot_time)

    return system_data

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(echo_client(('X.X.X.X', 25000),loop))



want to control remote system where client running .
...