【发布时间】:2015-03-29 12:53:07
【问题描述】:
我想知道如何实现一种“远程方法调用”(以非常简单的形式)。我正在以面向对象的方式编写程序。我有对象存在于树莓派上,而对象存在于我的计算机上。所以有时我想从我的计算机上的一个对象向树莓派上的一个对象发送消息。到目前为止没有什么太难的。但是当我希望该消息有结果时,我被卡住了。
例如,如何实现我计算机上的一个对象正在向树莓派发送带有参数 3 和 4 的消息“add”并期待结果 (7)?
我制定了一个协议,通过 TCP 向对象发送消息和参数。但是,如果预期结果,我的 Raspberry Pi 上的对象将不得不通过 TCP 发送新消息来回答。但是我怎么能得到这个答案?
我可以使用/进行阻塞操作,将消息发送到 Raspberry Pi 并等待返回结果。但在模拟程序中,我猜这不是你想要的。
所以我在想如何我可以在不进行阻塞操作的情况下实现它。我想出了这个:
我可以扩展负责通信的对象(通过 TCP)使用“消息表”。在该表中,我可以为每条消息存储 ID、消息本身、目标对象(在树莓派上)以及结果。
所以现在如果我想发送消息“getNumber”(它随机返回一个数字),我将使用消息和目的地调用通信对象。它将用唯一的 ID、消息和目的地填充表。 目标对象会在某个时刻完成计算并返回结果。 为此,它将通过 TCP 将其答案发送到将结果填充到表中的通信对象。 从那时起,只需传递 ID 即可请求消息的结果。通信对象所要做的就是从他的表中读取结果。
如果不通过 TCP/IP 进行通信,它看起来像:
(destination-object 'get-number) ; Results in a number, with TCP this could not have a result because the result itself also has to be send over TCP.
通过如上所述的通信:
(define id ((communication-object 'send-message) "get-number" "destination-object"))
(define result ((communication-object 'get-result) id))
因为我从未编写过通过 TCP/IP 进行通信的程序,所以我想知道这是否是处理消息及其结果的好方法,或者是否有更好/更简单的方法。
知道我正在用 Racket 编写程序,也许使用带有当前延续的调用是一种更简单的方法来实现这个(如果可能的话)?通过保留“未来”(仍然必须做的事情)直到知道结果。
【问题讨论】:
-
你到底在问什么?如何进行非阻塞 I/O? (答案:
char-ready?或byte-ready?)或者您是在问设计客户端/服务器程序的最佳方法是什么,其中远程计算机代表本地计算机进行计算? -
我想设计一个非阻塞 I/O。这就是为什么我保留一个消息“表”,所以当我收到答案时(使用字节准备好?知道是否有一些输入)我也把它放在表中。但无论如何,当我向树莓派发送消息时,我将不得不阻止该程序,等待答案。否则我将不得不以异步方式重新设计我的程序。
标签: tcp racket communication