从gSOAP服务器接收异步回调/事件的最佳方法是什么?
本文关键字:事件 最佳 方法 是什么 回调 服务器 gSOAP 异步 | 更新日期: 2023-09-27 18:10:32
我正在设计一个用于Windows CE设备和PC之间的web服务接口。Windows CE设备为服务器,PC机为客户端。
我决定使用gSOAP库来实现服务器,我使用。net/c#作为客户端。我遵循了这里描述的方法,一切都很顺利。
我的问题是如何最好地实现从服务器到客户端的异步回调/事件。我能想到两种方法:
- 连续轮询服务器活动事件
- 一个阻塞方法,在事件发生之前保持连接打开
我目前选择了选项2,它似乎工作得很好。我在客户端使用异步方法,因此在方法完成时获得回调,即当Windows CE设备上发生事件时。然后,我立即再次调用相同的方法,以便为下一个事件做好准备。
示例服务器方法(无错误处理):
int ns__WaitForEvent(struct soap* soap, int *eventId)
{
WaitForSingleObject(hMyServerEvent, INFINITE);
*eventId = GetCurrentEventId();
return SOAP_OK;
}
示例客户端(无错误处理):
private void SubscribeToServerEvents()
{
var server = new MyMethods.ServicePortTypeClient(
new BasicHttpBinding(),
new EndpointAddress(myIpAddress));
AsyncCallback cb = this.Callback;
server.BeginWaitForEvent(cb, server);
}
private void Callback(IAsyncResult ar)
{
var server = (MyMethods.ServicePortType)ar.AsyncState;
var result = server.EndWaitForEvent(ar);
// Do stuff with result
}
服务器必须是多线程的,并且应该限制客户端的数量,这样服务器就不会有大量的线程挂起阻塞方法。在我的例子中,这些问题都不是问题——使用gSOAP设置多线程服务器很简单,并且每个服务器上只会有一个客户端(由我控制)。
这种方法有什么明显的缺点吗?你能提出一个更好的解决办法吗?
我建议把WinCE设备变成一个网络客户端而不是一个网络服务器,把PC变成一个服务器,这样在客户端发生事情时就会收到通知。这种方法更自然,您仍然可以将gSoap用于soap客户机。在PC上,你应该安装一个web服务器,比如Apache或IIS,或者你可以做一个Windows服务器,它将托管一个嵌入式轻量级web服务器。