Python与C之间与操作系统无关的程序间通信

Python与C之间与操作系统无关的程序间通信,python,c,networking,network-protocols,inter-process-communicat,Python,C,Networking,Network Protocols,Inter Process Communicat,我几乎不知道我在这里做什么,我以前从未做过类似的事情,但我和一个朋友正在编写相互竞争的国际象棋程序,他们需要能够相互交流 他将主要使用C语言编写,我的大部分将使用Python,我可以看到一些选项: 交替写入临时文件或连续临时文件。由于通信不会以任何方式庞大,这可能会工作,但似乎是一个丑陋的工作在我身边,程序将不得不不断检查更改/新文件,它只是看起来丑陋 找到一些操纵管道的方法,例如我的.py |/他的。这似乎有点死胡同 使用插座。但我不知道我会做什么,所以有人能给我一个指向一些阅读材料的指针吗

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

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

  • 交替写入临时文件或连续临时文件。由于通信不会以任何方式庞大,这可能会工作,但似乎是一个丑陋的工作在我身边,程序将不得不不断检查更改/新文件,它只是看起来丑陋
  • 找到一些操纵管道的方法,例如我的.py |/他的。这似乎有点死胡同
  • 使用插座。但我不知道我会做什么,所以有人能给我一个指向一些阅读材料的指针吗?我不确定是否有独立于操作系统、独立于语言的方法。是否需要某种管理服务器程序来管理
  • 使用某种HTML协议,这似乎有些过分。我不介意程序必须在同一台机器上运行
人们推荐什么,我从哪里开始阅读?

您可以使用程序间协议,从每个文件开始读/写

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

一旦你有这个工作,你可以移动到使用套接字,每个程序将启动一个服务器,等待连接

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

无论哪种情况,您都需要一个交换协议

编辑

我读错了,我认为是C++。 无论如何,这里是对protobuf的C支持,但仍在进行中


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

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

对于阅读材料,这里有两种可能性:

  • 使用IP套接字。在Python文档中有很多。(如果只使用基本的读/写功能,就不会那么难。)另一方面,C中的套接字通常不那么容易使用

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

    这还有一个好处,即此应用程序可以检查移动是否合法。这有助于您发现漏洞并保持游戏公平


我认为只需编写一个包含黑白移动的xml文件即可。在一个单独的文件中标记轮到谁,并确保只有轮到谁的程序才会写入该文件以提交轮到谁

这里有一个链接,指向另一个小组提出的用于存储移动的xml格式

带有客户机/服务器型号的套接字…

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

本地客户端显示游戏的可视化表示,并存储棋子的状态(位置、已杀死/未杀死)以及关于棋子可以/不能做什么的规则(可以使用哪些棋子进行哪些移动以及棋盘的状态是否处于检查状态)

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

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

另一个客户机看到已经转弯,从服务器提取最后一步,计算移动是否发生在哪里,根据游戏规则验证移动,并在本地重播操作。完成后,它现在允许用户进行下一步(如果游戏结束,也可以不进行下一步)

客户端/服务器游戏通信最重要的部分是,向服务器发送尽可能少的数据,并在服务器上存储尽可能少的状态。这样,您就可以在本地或全球范围内播放,几乎没有延迟。只要你的客户和你对手的客户在同一套规则下运行,一切都应该正常

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

插座是最佳通信媒介的原因是:

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

这也是许多主要系统(如数据库)使用套接字作为网络和本地通信媒介的部分原因。

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

您不认为添加xml会使它更加复杂吗?这就是Gyppo提出的所有东西,再加上解析XML。这两种语言都有简单的html解析器,并且已经有了一个预先确定的规范来将他传递的信息存储为XML。剩下的就是用一个文件处理程序附加到包含xml的单个文本文件上,这可以说是应用程序可以完成的最简单的外部交互。这是互联网的工作方式,