使用 gSoap 的异步、确认、点对点连接
Posted
技术标签:
【中文标题】使用 gSoap 的异步、确认、点对点连接【英文标题】:Asynchronous, acknowledged, point-to-point connection using gSoap 【发布时间】:2013-04-10 12:51:11 【问题描述】:这是我的情况:
-
我有一个
wsdl
,“翻译”成这样的头文件:wsdl2h -o file.h file.wsdl
然后,我执行了soapcpp2 -Icorrect_path -j file.h
在“服务器端”我实现了服务,使用soapXXXService.[h|cpp]
再次在“服务器端”,我使用soap_init2
(和SOAP_IO_KEEPALIVE
),我有soap_bind
、soap_accept
、soap_copy
等,它似乎工作得非常好(见下文)
在“客户端”,我使用生成的proxy
对象(再次使用SOAP_IO_KEEPALIVE
),构造消息并将其发送到服务器
“服务器”收到此消息并发回 ACK(自定义XML
)
“客户”收到ACK
,一切正常。
所以,我现在要做的是让“服务器”返回 “真实” 响应给“客户端”,而“客户端”必须返回一个 ACK
给“服务器”。
这怎么可能? (应该是)
“你试过什么?”
我想到了两件事。
第一种方法是重用从soap_accept
返回的套接字文件描述符,以将“真实响应”发送回服务器。但这有可能吗?
Unix 套接字是全双工的,所以这在技术上是可行的,但gSoap
是否限制了这一点?因为我在文档中没有看到任何关于此的内容。
我想到的第二个选项是在“客户端”中创建相同的“服务”,以便接收消息(“真实响应”)并以相同的方式返回 ACK
在“服务器”中完成。但这意味着,“服务器”还必须有一个 proxy
对象的实例才能发送所谓的“真实响应”。
这对我来说听起来真的很丑陋和可怕。如果这是唯一的选择,我不会感到惊讶,但是..
编辑:对于第二个选项 - 这意味着客户端应该有一个侦听器端口,应该处理传入连接等。对我来说听起来不像一个客户端..
我了解,我可能遗漏了 gSoap
工作原理的一些基本部分,但我阅读了整个 user documentation 和 "getting started" guide 并没有找到任何相关信息。
如果有不清楚的地方请告诉我
编辑:这是我想要实现的场景:
-
客户端向服务器发送请求
服务器返回 ACK 作为响应(如标准 ACK)- 表示成功接收到请求
稍后,服务器向客户端发送响应(这是真正的响应)
客户端再次返回ACK - 表示成功收到响应
这种情况也可能是相反的:服务器也可以向客户端发送请求。这意味着 - 与上述相同的场景,但替换“客户端”“服务器”。
注意:request/response
和 ACK
都是 SOAP 消息。
【问题讨论】:
我想我现在明白了。我正在撤消我最初的答案。 关于第 1、2 和 3 点的问题。你需要你的客户发送它的请求,得到一个快速的“确认”,然后才能开始做其他事情,然后再检查回来看看是否收到了最后的回复?如果是这种情况,您可以改为使您的客户端多线程并消除第一个“ack”。让它发送请求,并在工作线程上等待最终响应,而客户端的主线程继续做有用的工作。 关于第4点的问题。为什么需要从客户端返回服务器的ack?如果需要,可以由 gSOAP 文档的第 7.4 节处理。 关于客户端和服务器角色互换的问题。客户端收到来自服务器的请求的可能性会在没有警告的情况下发生吗?意思是,客户端的任何操作都不会导致服务器向客户端发送 SOAP 请求?如果这是真的,那么客户端还需要实现一个带有监听器的 SOAP 服务器。 @DaveNewman - 抱歉回复晚了。对于您的第一条评论 - 是的,这就是我需要的,我有额外的线程,但是我正在实现一个标准协议(它依赖于SOAP
),我无法消除任何东西。我的客户端也应该能够与其他服务器通信。
【参考方案1】:
我在我的问题中使用option 2
实现了它。即:在客户端和服务器中实现服务(监听器)并使用代理(用于发送请求)。这样,我有以下内容:
-
服务器已启动
客户端已启动(启动侦听器,也称为“服务”)
client 发送 SOAP 请求(使用 proxy 对象),告诉服务器:“我起来了,我的位置是xxx”(
xxx
是URI,将用于连接服务器到客户端的监听器)
服务器响应带有 SOAP 消息 (ACK)(说:“好的,我知道你现在起床了”)李>
稍后 服务器 使用在第一条消息中接收到的位置向客户端发送 SOAP 请求(通过 代理 对象);这个请求是请求的真实响应,发送于3.
这说 - “好的,我准备好与你沟通了”
客户端向此请求 (ACK) 返回响应(说:“OK,cool”)
这样,客户端和服务器都知道彼此的位置,两者都有一个侦听器(服务的实现),两者都维护代理对象。
似乎这对我有用。如果有人给我另一种选择或在我的问题中对option 1
说些什么,我会很高兴。
编辑:经过几天的深入研究和对协议的深入分析,我打算实施,看来这是唯一的方法:
实现必须能够同时用作 SOAP 客户端和 SOAP 服务器
【讨论】:
以上是关于使用 gSoap 的异步、确认、点对点连接的主要内容,如果未能解决你的问题,请参考以下文章