【问题标题】:OS-independent Inter-program communication between Python and CPython和C之间的独立于操作系统的程序间通信
【发布时间】:2011-03-01 10:02:06
【问题描述】:

我几乎不知道自己在这里做什么,我以前从未做过这样的事情,但我和一个朋友正在编写竞争性国际象棋程序,他们需要能够相互交流。

他将主要使用 C 编写,我的大部分内容将使用 Python,我可以看到一些选项:

  • 交替写入临时文件或连续临时文件。由于通信不会以任何方式庞大,这可能会起作用,但对我来说似乎是一个丑陋的解决方法,程序将不得不不断检查更改/新文件,这看起来很丑陋。
  • 找到一些操纵管道的方法,即 mine.py| 。/他的 。这似乎有点死胡同。
  • 使用套接字。但我不知道我会做什么,所以有人可以给我一些阅读材料的指针吗?我不确定是否有独立于操作系统、独立于语言的方法。是否必须有某种主管服务器程序来管理?
  • 使用某种 HTML 协议,这似乎有点矫枉过正。我不介意程序必须在同一台机器上运行。

人们推荐什么,我可以从哪里开始阅读?

【问题讨论】:

  • 套接字。毕竟,这就是互联网的运作方式。没有比这更独立于平台的了!

标签: python c networking network-protocols inter-process-communicat


【解决方案1】:

如果您想要并且需要真正独立于操作系统、独立于语言的进程间通信,套接字可能是最佳选择。

这也将允许两个程序跨机器进行通信(无需更改代码)。

对于阅读材料,这里是Python Socket Programming How To

【讨论】:

  • 在通过套接字进行通信时,必须记住数字在不同的操作系统上可能有不同的字节序。 OTOH 是与通信本身无关的序列化问题。 Python Socket Programming 链接不工作(返回 404)。
【解决方案2】:

两种可能:

  • 使用 IP 套接字。 Python 文档中有some examples。 (如果你只使用基本的读/写东西,真的没那么难。)另一方面,C 中的套接字通常不是那么简单易用。

  • 创建第三个应用程序。它使用 subprocess 启动两个应用程序并通过管道与两个应用程序通信。国际象棋应用程序必须只能读取/写入标准输入/标准输出。

    这有一个额外的好处,这个应用程序可以检查移动是否合法。这有助于您发现错误并保持游戏公平。

【讨论】:

  • 单独的“比赛裁判程序”听起来像我要走的路。
【解决方案3】:

您可以使用Protobuf 作为程序间协议,并从文件中读取/写入每一轮。

您可以每 n 秒读取一次中间文件。

一旦你完成了这项工作,你就可以转而使用套接字,每个程序都会启动一个服务器并等待连接。

更改应该很小,因为协议已经是 protobuf。因此,您唯一需要更改的地方是从套接字或文件读取的位置。

在任何一种情况下,您都需要一个交换协议。

编辑

哎呀,我看错了,我以为是 C++。

无论如何,这是对 protobuf 的 C 支持,但仍在进行中

http://code.google.com/p/protobuf-c/

【讨论】:

    【解决方案4】:

    我想说只写一个包含黑白移动的 xml 文件。在单独的文件中标记轮到它的人,并确保只有轮到它的程序才会写入该文件以提交轮到它们。

    这里是一个链接,指向一个建议的 xml 格式,用于存储另一组提出的动作 http://www.xml.com/pub/a/2004/08/25/tourist.html

    【讨论】:

    • 您不认为添加 XML 会使它变得更加复杂吗?这就是 Gyppo 提出的plus解析 XML 的全部内容。
    • 两种语言都有简单的 html 解析器,并且已经有一个预先确定的规范来存储他作为 xml 传递的信息。剩下的就是使用文件处理程序附加到包含 xml 的单个文本文件,这可以说是应用程序可以执行的最简单的外部交互。
    【解决方案5】:

    具有客户端/服务器模型的套接字...

    基本上,您和您的朋友正在创建客户端的不同实现。

    本地客户端显示游戏的可视化表示并存储棋子的状态(位置、已杀死/未杀死)以及有关棋子可以/不能做什么的规则(可以使用哪个移动件以及板子的状态是否在检查中)。

    远程服务器存储有关玩家的状态(轮到谁、获得的积分、游戏是否获胜)以及已发生的动作列表。

    当您移动时,您的客户端会根据游戏规则验证该移动,然后向服务器发送一条消息,告诉您,我已经移动了,轮到您了。

    另一个客户端看到已经进行了转弯,从服务器拉出最后一步,计算移动是否发生在哪里,根据游戏规则验证移动,并在本地重播动作。在这一切完成之后,它现在允许用户进行下一步操作(或者如果游戏结束则不能)。

    客户端/服务器游戏通信最重要的部分是向服务器发送尽可能少的数据并在服务器上存储尽可能少的状态。这样您就可以在本地播放它,也可以在世界各地播放,几乎没有延迟。只要您的客户端运行在与您对手的客户端相同的规则集下,一切都应该正常运行。

    如果你想确保没有人可以通过破解他们的客户端版本来作弊,你可以让位置和规则计算都在服务器上完成,只是让客户端只是简单的播放机制。

    socket 是最好的通信媒介的原因是:

    • 跨进程通信的限制几乎与跨节点通信一样困难
    • 所有系统都广泛支持联网
    • 如果您选择远程使用,几乎没有或没有进入障碍
    • 网络功能强大、灵活且经过验证

    这就是为什么许多主要系统(如数据库)使用套接字作为网络以及本地通信介质的部分原因。

    【讨论】:

      【解决方案6】:

      如果两个应用程序都在同一台计算机上运行,​​请使用套接字并将您的对象序列化为 jsun。否则,请使用 Web 服务和 jsun 或 xml。您可以找到两种语言的 jsun 和 xml 解析器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        相关资源
        最近更新 更多