与多个独立进程(1个服务器,n个客户端)的本地计算机进程间通信

时间:2018-12-14 12:35:08

标签: python linux pipe ipc

我希望有一个服务器进程(最好是Python)接受简单的消息,并有多个客户端(同样最好是Python)连接到服务器并向其发送消息。服务器和客户端将只能在同一台本地计算机上运行,​​并且操作系统基于Linux。服务器将由操作系统自动启动,客户端随后将独立于服务器启动。我强烈希望避免安装整个单独的消息传递框架/服务器来执行此操作。消息将是简单的字符串,例如“踢”,甚至只是表示消息类型的单个字节。它还需要知道何时建立和丢失连接。

根据这些要求,我认为命名管道将是一个可行的解决方案,并为每个客户端连接创建该管道的新实例。但是,当我搜索示例时,遇到的所有示例都处理从同一父进程衍生而来的进程,而不是独立启动的,这意味着它们可以将父引用传递给子进程。

Windows似乎允许使用命名管道的多个实例(每个客户端连接一个实例),但是我不确定在基于Linux的操作系统上是否可以实现?

即使有人只是伪代码,也请有人指出正确的方向,最好举个基本的例子。

我已经看过Python中的多处理模块,但这似乎是围绕着服务器和客户端共享相同的进程,或者让一个产生另一个。

修改 可能很重要,不能保证主机设备具有联网功能(嵌入式设备)。

1 个答案:

答案 0 :(得分:1)

我以前曾用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消息