9

这是我的情况:

  1. 我有一个wsdl“翻译”成这样的头文件:wsdl2h -o file.h file.wsdl
  2. 然后,我执行了soapcpp2 -Icorrect_path -j file.h
  3. 在“服务器端”我实现了服务,使用soapXXXService.[h|cpp]
  4. 再次在“服务器端”,我使用soap_init2(with SOAP_IO_KEEPALIVE),我有soap_bind, soap_accept,soap_copy等,它似乎工作得很好(见下文)
  5. 在“客户端”,我使用生成的proxy对象(再次使用SOAP_IO_KEEPALIVE),构造消息并将其发送到服务器
  6. “服务器”收到此消息并发送回 ACK(自定义XML
  7. “客户”收到了ACK,一切都很好。

所以,我现在要做的是让“服务器”返回“真实”响应给“客户端”,而“客户端”必须返回一个ACK给“服务器”。

这怎么可能?(它应该是)


“你试过什么?”

我想到了两件事。

第一个是以某种方式重用从 中返回的套接字的文件描述符soap_accept,以将“真实响应”发送回服务器。但这可能吗?
Unix 套接字是全双工的,所以这在技术上是可行的,但是否gSoap限制了这一点?因为我在文档中没有看到任何关于此的内容。

我想到的第二个选项是在“客户端”中创建相同的“服务”,以便接收消息(“真实响应”)并以ACK与“服务器”中相同的方式返回. 但这意味着,“服务器”还必须有一个proxy对象实例才能发送所谓的“真实响应”。
这对我来说听起来真的很丑陋和可怕。如果这是唯一的选择,我不会感到惊讶,但是..

编辑:对于第二个选项 - 这意味着客户端应该有一个侦听器端口,应该处理传入连接等。对我来说听起来不像一个客户端..


我了解,我可能遗漏了一些基本的gSoap工作原理,但我阅读了整个用户文档“入门”指南,但没有找到任何相关信息。

如果有什么不清楚的地方请告诉我


编辑:这是我想要实现的场景:

  1. 客户端向服务器发送请求
  2. 服务器返回ACK作为响应(如标准 ACK) - 表示成功接收到请求
  3. 稍后,服务器向客户端发送响应(这是真正的响应)
  4. 客户端再次返回ACK - 信号成功收到响应

这种情况也可能是相反的:服务器也可以向客户端发送请求。这意味着 - 与上述相同的场景,但替换“客户端”<->“服务器”。

注意:request/response都是SOAP 消息。ACK

4

1 回答 1

2

option 2我在我的问题中使用它来实现它。即:在客户端和服务器中实现服务(监听器)并使用代理(用于发送请求)。这样,我有以下内容:

  1. 服务器已启动
  2. 客户端启动(启动一个监听器,又名“服务”)
  3. 客户端发送SOAP请求(使用代理对象),告诉服务器:“我起来了,我的位置是 xxx”xxx是 URI,将用于将服务器连接到客户端的侦听器)
  4. 服务器SOAP消息 (ACK)响应(说: “好的,我看到你现在起床了”
  5. 稍后,服务器使用在第一条消息中接收到的位置向客户端发送SOAP 请求(通过代理对象);这个请求是请求的真实响应,发送进来3.这说—— “好的,我准备好和你沟通了”
  6. 客户端返回对这个请求的响应(ACK)(说:“OK,cool”

这样,客户端和服务器都知道彼此的位置,都有一个监听器(服务的实现),维护代理对象。


似乎这对我有用。如果有人给我另一个选择或option 1在我的问题中说些什么,我会很高兴。


编辑:经过几天的深入研究和对协议的深入分析之后,我打算实施,看来,这是做到这一点的唯一方法:

实现必须能够充当 SOAP 客户端和 SOAP 服务器

于 2013-04-15T13:57:54.850 回答