CF app与服务器的双向通信

时间:2011-09-22 08:07:24

标签: c# wcf web-services compact-framework polling

使用PDA的现场用户将生成消息并发送到服务器;服务器端的用户将生成需要发送到PDA的消息。

消息在应用和服务器代码之间;不是100%用户输入的数据。即,我们将捕获表格中的一些数据,添加GPS位置,时间日期等,并将其发送到服务器。

服务器可能会向我们发送消息,例如PDA应用程序中使用的数据库记录的更新,用户的消息等。

对于从PDA到服务器的消息,这很容易。 PDA启动对服务器的调用并传递数据。目前在服务器端使用Web服务,并在PDA上“添加新的Web引用”和相关代码。

我正试图及时地从服务器向PDA发送消息。在某些情况下,快速接收消息很重要。

如果服务器有特定PDA的消息,那么PDA在几秒钟内就可以接收到它。所以每分钟一次投票就结束了;每秒轮询一次会产生大量的流量,并且可能会使PDA电池耗尽一些?

此帖与我的问题相同,建议使用http长轮询: Windows Mobile 6.0/6.5 - Push Notification

我已经研究过WCF回调,但它们看起来正是我想要的,但不适用于紧凑的框架。

下一篇文章不适用于CF,但会引发服务可用性问题:

To poll or not to poll (in a web services context)

在我的上下文中,我将有500-700台设备想要与少量网络服务(2-5之间)进行通信。

这是一个很长的轮询要求保持开放。

插座是否可行?这又是很多关系。

我还阅读了有关使用exchange或gmail的方法;我真的很犹豫那条路走下去。

我在这里和谷歌发现的大多数帖子都有几年了;从那以后可能会出现一些事情?

处理500-700 PDA CF设备的最佳方法是什么,这些设备需要从服务器进行近乎即时的通信,同时保持电池寿命?请求很高我确定。

3 个答案:

答案 0 :(得分:0)

套接字通信似乎是最简单的方法。你说你正在使用webservices进行客户端 - 服务器通信,这主要是由服务器(webservice)在幕后完成,打开一个套接字并监听到达的数据包,然后响应这些数据包。

您希望反向采用相同的方法,因此每个客户端在其计算机上打开一个套接字并等待流量到达。客户端基本上需要轮询自己的套接字(不会产生任何网络流量)。客户端还需要将其IP地址和套接字传送到服务器,以便当服务器需要与客户端进行通信时,它有一种到达它的方法。然后,服务器将使用基于套接字的通信(而不是webservices)根据需要发送消息。服务器只需打开套接字,发送消息,然后再次关闭套接字。不需要有很多永久打开的插座。

如果客户端正在漫游并在网络之间跳跃,则可能会有捕获。如果是这种情况,则可能是IP地址将发生变化(客户端需要打开一个新的套接字并将新的ip地址/套接字信息传递给服务器)。它还会增加服务器无法与客户端通信的可能性。

听起来像一个有趣的项目。祝你好运!

答案 1 :(得分:0)

在很久以前,CF团队构建了一个名为“Lunch Launcher”的应用程序,该应用程序基于WCF存储转发消息传递。 David Kline做了一个很好的系列文章(here the last one,其中包含了所有早期文章的TOC)。

吉姆·威尔逊给出了一个on-demand Webcast on MSDN,它提供了存储转发的概要以及来自该网络广播的代码is available here

这可能会做你想要的,虽然它有一些依赖(例如Exchange)和一些固有的限制(例如没有内置的交付确认)。

答案 2 :(得分:0)

好的,进一步观察,我可能更接近我想要的东西;无论如何,我认为这是一种http长调查。

这篇文章 - http://www.codeproject.com/KB/IP/socketsincsharp.aspx - 展示了如何在套接字上拥有一个监听器。所以我在服务器端这样做。

然后客户端在此端口打开一个到服务器的套接字;发送它的设备ID。 服务器代码首先检查是否存在该设备的响应。如果有,它会回应。

如果没有,它要么轮询自己,要么订阅某个事件;然后在有数据时返回。

如果需要,我可以在服务器端安装超时代码。

在客户端阻塞我并不担心,因为它是后台线程,没有数据与应用级别的阻塞相同;至于CPU&面对生活,不确定。

我知道我写的内容相当广泛,但这是一个值得探索的策略吗?