6

我很少知道我在这里做什么,我从来没有做过这样的事情,但是我和一个朋友正在写竞争性的国际象棋程序,他们需要能够相互沟通。独立于操作系统的Python和C之间的程序间通信

他会主要写在C,我的大部分将在Python中,我可以看到几个选项:

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

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

+0

套接字。毕竟,这是互联网的工作方式。而且你不能获得更多的与平台无关的东西! – Santa 2010-06-09 00:18:14

回答

7

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

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

+1

在通过套接字进行通信时,必须记住数字在各种操作系统上可能具有不同的字节顺序。 OTOH是序列化问题,与通信本身无关。 Python套接字编程链接不工作(返回404)。 – 2010-06-24 16:24:06

2

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

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

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

变化应该很小,因为协议已经是protobuf了。所以,唯一需要更改的地方是你从套接字或文件中读取的位置。

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

编辑

哎呀我误解,我认为这是C++。

不管怎么说,这是为的protobuf的支持C,但正在进行的工作。如果你想要和需要真正独立于操作系统,与语言无关的进程间通信,插座可能是最好的选择仍然是工作

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

3

两种可能性:

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

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

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

+1

单独的“比赛裁判进程”听起来就像去我的路。 – caf 2010-06-08 23:51:35

0

我会说只是写一个包含黑白动作的xml文件。在一个单独的文件中标记出来,并确保只有程序转向它才会写入该文件来轮流执行。

这里是一个建议XML格式存储你的动作,另一组想出了 http://www.xml.com/pub/a/2004/08/25/tourist.html

+1

你不觉得添加XML会让它变得更加复杂吗?这就是Gyppo提出的**加**解析XML的一切。 – 2010-06-08 22:47:34

+0

这两种语言都有简单的html解析器,并且已经有一个预定义的规范来存储他作为xml传递的信息。剩下的就是用文件处理程序附加到保存xml的单个文本文件,该处理程序可以说是应用程序可以执行的最简单的外部交互。 – 2010-06-08 23:06:54

0

套接字与客户端/服务器模型的链接...

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

本地客户端显示游戏的视觉表示并存储棋子的状态(位置,死亡/未杀死)以及关于棋子可以/不可以做什么的规则(哪些棋子可以用哪些棋子以及棋盘的状态是否受到检查)。

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

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

另一个客户端发现已经进行了转向,从服务器拉出最后一步,计算移动发生的位置,根据游戏规则验证移动,并在本地重播动作。在完成之后,现在允许用户进行下一步(或者如果游戏结束了)。

客户端/服务器游戏通信最重要的部分是,将尽可能少的数据发送到服务器并尽可能少地存储。这样,您可以在本地或全球范围内播放,延迟很少或没有延迟。只要你的客户在与你的对手的客户同样的规则下运行,一切都应该起作用。

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

之所以插座是最好的通信介质是:

  • 跨进程通信的限制几乎是跨节点的通信困难
  • 联网的广泛支持所有系统上
  • 几乎没有或者如果您选择
  • 这个网络是健壮的,灵活的,并且被证明是没有障碍的使用这个远程

这就是为什么许多像Databases这样的主要系统使用套接字作为网络和本地通信媒介一样的原因的一部分。

相关问题