2010-07-19 96 views
1

我有一个处理各种不同命令的远程服务器,其中一个是事件提取方法。XMLRPCPP异步处理多个调用?

如果队列中列出的一个或多个事件准备好处理,则事件获取会立即返回。如果事件队列为空,则此方法在数秒后才会返回。这样我就不会遇到任何HTTP /套接字超时。一旦事件可用,该方法立即返回。这样客户端才会连接到服务器,并且服务器不必与客户端建立任何连接。这个事件机制很好地工作。我正在使用增强库来处理队列,事件通知等。

这是问题所在。当服务器阻止从事件获取方法返回时,在此期间,我不能发出任何其他命令。 在源代码XmlRpcDispatch.cpp中,我在“工作”方法中看到了一个使用阻塞调用来“选择”的简单循环。 似乎在处理方法繁忙时,不会处理其他任何请求。

问题:我没有看到什么,XmlRpcpp(xmlrpC++)可以异步处理多个请求吗?有谁知道C++更好的xmlrpc库吗?我不假设Boost库有一个让我发出远程命令的组件? 我其实不在乎XML或over-HTTP功能。我只需要通过TCP以任何形状或形式发布(异步)命令? 我期待任何人可能提供的任何输入。

回答

1

我遇到了一些问题XMLRPC还,并研究了像gSOAP的和XMLRPC++许多解决方案,但最终我放弃了,使用Boost.ASIOTinyXML++写整个HTTP + XML-RPC从头开始(后来我swaped TinyXML使用expat)。这不是那么多工作;我在大约一个星期内自己做了,从头开始,并结束了许多完全实施的RPC调用。

Boost.ASIO给出了很好的结果。就像它的名字所说的那样,它完全是异步的,而且性能优良,开销很小,对我来说这很重要,因为它在嵌入式环境(MIPS)中运行。

后来,这可能是你的情况,我将XML更改为Google's Protocol-buffers,甚至更快乐。它的API以及它的消息容器都是类型安全的(即,你发送一个int和一个float,并且它永远不会被转换为字符串并返回,就像XML的情况一样),一旦你掌握了它,这不需要很长时间,这是非常高效的解决方案。

我recomendation:如果你能够摆脱XML,去Boost.ASIO + Protobuf
如果您需要XML:Boost.ASIO + Expat

从头开始做这个东西是真的值得它。

+0

我在考虑使用boost的asio。我希望我可以将整数和字符串写入C++端的流中,并使用DataInputStream读取在Java端接收它。 – Mike 2010-07-22 19:46:28

+0

@Mike然后我强烈建议使用XML或protobuf;因为这样做可能会有一些小问题,他们都会为你处理这个问题。 – Gianni 2010-07-22 21:53:52

+0

@Gianni。遇到asio的问题。我有一个事件队列,当它为空时,并且在使用套接字通信进行查询时,会在返回之前等待一段时间,并报告队列为空,或者在队列变为可用时唤醒并报告队列的内容。 所以客户端有两个连接到服务器。一个发布指令,另一个获取(等待)事件。 问题是,当使用asio时,当一个会话正在等待时,另一个不接受任何命令。所以换句话说,一个会话是另一个会话。 非常不同步? – Mike 2010-07-26 17:38:00