什么是最简单的进程间通信方法 - 跨任何操作系统和语言

Posted

技术标签:

【中文标题】什么是最简单的进程间通信方法 - 跨任何操作系统和语言【英文标题】:What is the simplest method for Interprocess Communication - across any O/S & language 【发布时间】:2011-09-17 20:06:49 【问题描述】:

对于编程竞赛 (code war),我想将其设置为将游戏状态传递给 A.I.作为一个 xml 文件和那个 A.I.回复它会返回一个 xml 文件,它会返回到我的应用程序。然后,比赛中的每个团队都可以实施他们的人工智能。使用他们最熟悉的语言和操作系统。

性能并不重要。它是两个小的 xml 文件(我说的是文件,但它可能只存在于内存中),它们被来回传递。但简单性很重要,这样可以快速轻松地以任何语言实现客户端 (A.I.)。

我想在服务器上打开一个 TCP 套接字,发送状态 xml 文件,然后进入接收模式等待打开 xml 文件。而且我也会有一个等待超时,这样如果我在一秒钟内没有收到任何答复,我就会为他们设置一个默认轮次。

在客户端,它等待 TCP 套接字连接,读取 xml 文件,确定轮到它,然后将 xml 文件写回。

这是让客户可以快速轻松地用几乎任何语言编写的最佳方式吗?

更新:这将使每个玩家在不同的机器上。必须允许这样做,因为有些人更喜欢 Windows 和一些 Linux。而且它使这个过程更容易。

谢谢 - 戴夫

【问题讨论】:

【参考方案1】:

如果您的客户端和服务器在同一台机器上运行,则将标准输入/标准输出用于 IPC 可能会更容易。服务器将执行 AI 进程,将 XML 文档写入 AI 标准输入,然后等待 AI 标准输出上的响应。

如果您的 AI 需要长时间运行(例如,为了保持大量持久状态),那么您可以将 AI 分成两部分,一个是“常驻”的,另一个是接口组件由游戏进程为每一回合运行。接口组件可以通过最适合该语言的任何机制(REST、共享内存、消息传递等)与驻留部分进行通信。

【讨论】:

在同一台机器上肯定不行——因为有些人更喜欢 Windows 而其他人更喜欢 Linux。我也认为 stdout 不好,因为 1 秒后我删除了它们,我发现在 Windows 上读取没有响应的 stdout 是一个问题。 即使你不在同一台机器上,如果通讯结构是这样的,你可以使用netcat来管理机器间的通信。使用nc -l <port> | AI | nc <server> 运行AI,服务器运行两个匹配的nc 命令结束【参考方案2】:

无论您使用何种语言,您都需要一个 XML 包。

您也可以使用基于 TCP/IP 的 HTTP 包 - 当然,它不必使用端口 80。这很可能是与不同​​语言的“标准”或“接近标准”的最佳支持相结合。

【讨论】:

http(比如 REST)的问题在于服务器端必须是人工智能。播放器,这在某些语言中比简单的套接字要多得多。

以上是关于什么是最简单的进程间通信方法 - 跨任何操作系统和语言的主要内容,如果未能解决你的问题,请参考以下文章

“松散”的进程间通信

大型项目中进程间通信的最佳和最简单方法

资深程序员:深入Python进程间通信原理!

使用环境变量进行简单的进程间通信

Linux进程间通信 -- 数据报套接字 socket()bind()sendto()recvfrom()close()

进程间通信、操作系统、管道