Как я могу запускать команды на удаленных клиентах с уникальными идентификаторами при использовании графического интерфейса pyqt5 с сервером python и несколькими клиентами python

Проблема в том, что при использовании графического интерфейса PYQT5 на стороне сервера я не могу отправлять команды на удаленно управляемые устройства (агенты на хосте) и отправлять результаты (информацию) обратно на сервер с идентификацией клиента. У клиентов не будет графического интерфейса. Мне придется выбирать, какие клиенты получат определенные команды на основе идентификации клиента или сеанса. Я использую конструктор Pyqt5, и мой код на Python отделен от основного приложения.

Сценарий заключается в том, что у меня есть структура обработки инцидентов сетевой безопасности pyqt5, которая запускает сервер, а затем просматривает соединения. Затем у меня есть агент python (client.py), который снова подключается к серверу. Соединение происходит, и в настоящее время я могу отправить клиенту только одну команду (одну переменную) и передать результаты обратно в фреймворк. Я не могу отправить несколько команд нескольким клиентам на основе идентификатора клиента или сеанса.

Одна из самых больших проблем заключается в том, что у меня есть работающий терминал в графическом интерфейсе моего сервера, и я не могу передавать текст QLineEdit клиентам на основе сеансов. Если я добавлю ввод python (->), то все будет отлично работать, однако пользователи не смогут использовать графический интерфейс, и я хочу, чтобы пользователи использовали графический интерфейс.

пока я работаю над решением, мои примеры кода расположены ниже

https://github.com/jinverar/multiconn-client-server

и пример кода на github основан на следующем руководстве по python

https://realpython.com/python-sockets/#application-client-and-server

Основные ссылки, которые помогли мне больше всего, перечислены ниже.

PyQt5: отправка и получение сообщений между клиентом и сервером

https://github.com/jinverar/TCP-ReverseShell

Соединение сервер-клиент в PyQt

http://www.mranuran.com/blog/2017/08/04/creating-graphical-chat-application-using-pyqt-and-socket/

Некоторые дополнительные ссылки, которые помогли мне до сих пор, перечислены ниже.

https://www.riverbankcomputing.com/static/Docs/PyQt5/gotchas.html

https://het.as.utexas.edu/HET/Software/PyQt/qabstractsocket.html#setSocketDescriptor

http://www.mranuran.com/blog/2017/08/04/creating-graphical-chat-application-using-pyqt-and-socket/

https://www.zeolearn.com/magazine/getting-started-guis-with-python-pyqt-qthread-class

Следующие шаги были рекомендованы для продвижения вперед и являются возможным решением.

1) вместо расширенного графического интерфейса создайте чрезвычайно простой интерфейс с кнопкой - когда вы нажимаете кнопку, он отправляет сообщение на сервер - затем нажмите кнопку более одного раза, возможно, отправив значение счетчика для каждого нажатия кнопки на server таким образом вы можете проверить непрерывность соединения.

2) Затем на сервере сделайте что-то подобное и посмотрите, может ли сервер отправить сообщение функции приема вашего клиента, и в обоих случаях просто напечатайте, что вы получили сообщение - это должно помочь вам устранить эти перегибы, а затем вы можете построить оттуда.

следующие пункты являются дополнительным руководством.

1) Сторона сервера должна работать как служба на сервере - без графического интерфейса и изначально просто отправлять вывод в обычное окно консоли.

2) Простой графический интерфейс с Client-Communicator, который вы сначала делаете, убедитесь, что вы можете отправлять несколько сообщений на сервер, и он получает их все

3) Затем вы создаете простой графический интерфейс сервера, который общается с вашей сервисной программой (или вы можете интегрировать ее, если не знаете, как это сделать), затем несколько раз нажимаете кнопку, чтобы убедиться, что вы разговариваете с клиентом в порядке.

После того, как вы это сделаете, вы должны протестировать и запустить коммуникатор, а затем мы просто подключим более надежную функциональность и более полные графические интерфейсы.

Затем 1) Создайте коммуникатор как услугу

2) Добавить аспект API в коммуникатор

3) Создайте графический интерфейс для выполнения команд

4) Попросите графический интерфейс отправить информацию в коммуникатор через вызов созданного вами API.

сделать это

1) Реализовать Сервис нажатием кнопки, если он еще не реализован

2) Запустить/остановить службу через звонок

3) Получить данные от этой службы (или, в вашем случае, отправить данные и получить данные от)


person jedimonk    schedule 22.07.2019    source источник
comment
Хорошо, сначала (MVC-ish It) --- то есть используйте pyqt5 только для рендеринга вашего клиентского (или серверного) графического интерфейса и используйте чистый python для таких внутренних реализаций связи. Смешение двух элементов создаст проблемы с кодированием позже, если не сразу.   -  person Dennis Jensen    schedule 22.07.2019
comment
У меня есть версия сервера (бэкенда) на чистом питоне и клиент на чистом питоне, и мне все еще нужна помощь. Чистый сервер Python имеет многопоточность, и я все еще могу отправить только одну команду. Кажется, я не могу получить доступ к редактированию строки pyqt5 для отправки нескольких команд. У меня также есть консольная версия, которая безупречно работает без pyqt5, но я хочу, чтобы пользователи теперь видели графический интерфейс.   -  person jedimonk    schedule 22.07.2019
comment
Хорошо, внешний интерфейс GUI будет отвечать за отправку текста LineEdit при обновлении API для серверной части, тогда серверная часть возьмет на себя и, при необходимости, отправит что-то во внешний интерфейс в ответ, который затем обработает отправку. на дисплей соответственно. Что касается многопоточности с python, имейте в виду, что, хотя вы можете использовать многопоточность, вы не можете выполнять многопроцессорную обработку с python без добавления функции многопроцессорности или обработки многопроцессорности вне python - см. это realpython.com/intro-to-python-threading   -  person Dennis Jensen    schedule 22.07.2019
comment
Возможно ли, что моя переменная client_command, которая вызывает console_lineedit, вложена в функцию, и мой сервер python и сервер pyqt не могут получать команды? Когда я добавляю в command = input(), мой пользовательский ввод python отображается в окне консоли, например cmd.exe или окне PowerShell. Команда = input() работает отлично.   -  person jedimonk    schedule 23.07.2019
comment
Хорошо, это может помочь, но не уверен, realpython.com/python-sockets, опять же, методология должна быть клиентской. pyqt-gui общается с коммуникатором client-python, который отправляет/получает сообщение на коммуникатор server-python, который общается с server-pyqt-gui (или интерфейсом командной строки), при этом вам даже не нужен client-pyqt- gui просто приложение с голыми костями, которое имитирует его в сочетании с вашим клиент-python-коммуникатором - как только вы заставите его общаться с вашим сервером, тогда беспокойтесь о добавлении графического интерфейса по мере необходимости - в основном разбейте его на более мелкие части и заставьте их работать   -  person Dennis Jensen    schedule 23.07.2019
comment
@DennisJensen Я принял участие и читаю предоставленную вами ссылку. Эта ссылка выглядит как БОЛЬШАЯ ссылка, которую я пропустил, и она мне очень поможет. Лучшая часть ссылки — клиент и сервер с несколькими подключениями. Один быстрый вопрос: как я могу заставить pyqt5 QlineEdit отправлять команды клиентам? QlineEdit находится в функции с именем console_commands(), и я могу опубликовать код, который полезен для этого вопроса, однако я не уверен, какие блоки кода полезны.   -  person jedimonk    schedule 23.07.2019
comment
Возможно, это поможет там stackoverflow.com/questions/22531578/ --- но в основном, когда встречается событие изменения для LineEdit, вы вызываете функцию, которая затем захватывает содержимое lineedit и завершает его. (однако требуется протокол, который, как я полагаю, вы полностью контролируете) и отправляет его в вашу API-функцию python-client-communicator, которую вы настроили для получения такой информации.   -  person Dennis Jensen    schedule 23.07.2019
comment
Окей, звучит хорошо. Мой QlineEdit отлично работает, чтобы делать что-то в графическом интерфейсе, и я могу распечатать меню справки в TextEdit и многое другое. Однако я не могу отправить команды клиентам. В настоящее время я использую returnPressed.connect. ui.console_lineEdit.returnPressed.connect(console_commands) ui.console_lineEdit.returnPressed.connect(ui.console_lineEdit.clear)   -  person jedimonk    schedule 23.07.2019
comment
Хорошо, имейте в виду, что графический интерфейс пользователя отделен от вашего коммуникатора, поэтому функция, которая улавливает изменения, должна (1) получить значение, содержащееся в вашем LineEdit (2), возможно, стереть содержимое вашего LineEdit (3) взять полученные данные и обернуть- it-up (это то, что вам нужно делать или не делать с этой информацией — например, проверка и что-то еще — до отправки в вашу функцию API Client-Communicator — это вы должны иметь возможность протестировать через прокси, так как вы можете поместите оператор печати в функцию Com API, которая просто печатает полученное сообщение из графического интерфейса   -  person Dennis Jensen    schedule 23.07.2019
comment
После того, как у вас это заработает или вместо этого вы сможете протестировать свой метод Client-Com, который отправляет и получает данные на/с вашего сервера, тогда, когда у вас есть Client-Com, правильно разговаривающий с сервером и правильно разговаривающий с Client-Gui, вы просто подключаетесь эти последние точки и готово --- Помните, что автономия - ваш друг, но вам нужно правильно ее реализовать, иначе она станет вашим врагом :)   -  person Dennis Jensen    schedule 23.07.2019
comment
@DennisJensen Я просмотрел ссылку, и информация отличная, однако учебник не работает. Сервер запускается и слушает, однако клиент не подключается. Я вытащил информацию, которая, по моему мнению, должна работать, и она находится здесь. gist.github.com/jinverar/2a6d9faa63511c696d5b5920094edd90 Если бы это работало, я бы добавил его сюда вопрос о переполнении стека. Дополнительным примечанием является то, что оба моих текущих сервера принимают несколько клиентов, однако я открыт для тестирования нового метода. Я также узнал о библиотеке селекторов.   -  person jedimonk    schedule 23.07.2019
comment
Я отредактировал вопрос выше   -  person jedimonk    schedule 24.07.2019