Межпроцессное взаимодействие локального компьютера с несколькими независимыми процессами (1 сервер, n клиентов) - PullRequest
0 голосов
/ 14 декабря 2018

Я хотел бы иметь серверный процесс (предпочтительно Python), который принимает простые сообщения и несколько клиентов (опять же, предпочтительно Python), которые подключаются к серверу и отправляют ему сообщения.Сервер и клиенты будут работать только на одном локальном компьютере, а ОС работает на Linux.Сервер будет автоматически запущен операционной системой, а клиенты будут запущены позже независимо от сервера.Я настоятельно хочу избежать установки отдельной платформы обмена сообщениями / сервера для этого.Сообщения будут представлять собой простые строки, такие как «kick», или даже просто один байт, представляющий тип сообщения.Также необходимо знать, когда соединение установлено и потеряно.

Исходя из этих требований, я думаю, что именованные каналы были бы возможным решением, с новым экземпляром этого канала, созданным для каждого клиентского соединения.Однако, когда я ищу примеры, все, с которыми я сталкивался, имеют дело с процессами, которые порождены из того же самого родительского процесса и не запускаются независимо, что означает, что они могут передать родительскую ссылку на дочерний процесс.

Windowsкажется, допускает несколько экземпляров именованного канала (по одному для каждого клиентского соединения), но я не уверен, возможно ли это на ОС на базе Linux?

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

Я смотрел на модуль многопроцессорной обработки в Python, но, похоже, он ориентирован на сервер и клиент, совместно использующий один и тот же процесс или один из которых порождает другой.

Редактировать Возможно, важно, чтобы хост-устройство не гарантировало сетевые возможности (встроенное устройство).

1 Ответ

0 голосов
/ 14 декабря 2018

Я использовал zeromq для такого рода вещей раньше.это относительно легкая библиотека, которая предоставляет такую ​​функциональность

, в противном случае вы можете реализовать ее самостоятельно, bind вставив сокет в процесс сервера и имея клиентов connect.это прекрасно работает для сокетов домена unix, просто передайте AF_UNIX при создании сокета, например:

import socket

with socket.socket(socket.AF_UNIX) as s:
    s.bind('/tmp/srv')
    s.listen(1)

    (c, addr) = s.accept()
    with c:
        c.send(b"hello world")

для сервера и:

with socket.socket(socket.AF_UNIX) as c:
    c.connect('/tmp/srv')
    print(c.recv(8192))

для клиента.

Написание протокола вокруг этого более сложное дело, и именно здесь такие вещи, как zmq, действительно помогают, где вы можете легко перемещать сообщения JSON вокруг

...