独立于操作系统的Python和C之间的程序间通信

时间:2010-06-08 22:36:19

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

我很不清楚我在这里做了什么,我之前从未做过这样的事情,但我和朋友正在编写竞争的国际象棋程序,他们需要能够相互沟通。

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

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

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

6 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

两种可能性:

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

  • 创建第三个应用程序。它使用子进程启动两个应用程序,并通过管道与两个应用程序通信。国际象棋应用程序必须只能读/写stdin / stdout。

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

答案 2 :(得分:2)

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

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

一旦你有了这个工作,你可以转向使用套接字,其中每个程序将启动一个服务器并等待连接。

变化应该很小,因为协议已经是protobuf。因此,您必须更改的唯一位置是从套接字或文件中读取的位置。

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

修改

Ooops我误读了,我以为是C ++。

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

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

答案 3 :(得分:0)

我想说只需编写一个包含黑白移动的xml文件。标记在一个单独的文件中谁转过来,并确保只有转动它的程序将写入该文件以提交轮到他们。

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

答案 4 :(得分:0)

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

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

本地客户端显示游戏的可视化表示并存储棋子的状态(位置,杀死/未杀死)以及关于棋子能够/不能做什么的规则(可以使用哪些动作进行碎片以及董事会的状态是否正在检查中。

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

当你采取行动时,你的客户会根据游戏规则验证移动,然后向服务器发送一条消息,说明我做了这个动作。

另一个客户端看到已经转弯,从服务器拉出最后一步,计算移动发生的位置,根据游戏规则验证移动,并在本地重放动作。完成所有操作后,它现在允许用户进行下一步行动(如果游戏结束,则不允许)。

客户端/服务器游戏通信最重要的部分是,在服务器上以尽可能少的状态发送尽可能少的数据。通过这种方式,您可以在本地或全世界范围内轻松或无延迟地播放。只要您的客户在与对手的客户相同的规则下运行,一切都应该有效。

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

套接字是最好的通信媒介的原因是:

  • 跨进程通信的限制几乎与跨节点通信一样困难
  • 网络在所有系统上得到广泛支持
  • 如果选择
  • ,很少或根本没有使用此功能的障碍
  • 网络稳健,灵活且经过验证

这就是为什么像数据库这样的许多主要系统使用套接字作为网络以及本地通信媒体的部分原因。

答案 5 :(得分:0)

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