我正在尝试编写一个基于TCP的自定义长轮询服务器,它将作为需要比移动电话提供更多持久性的其他TCP连接的中间人。
我尝试这样做的方法是在C#中编写异步TCP服务器,并使用C#编写匹配的TCP客户端。
长轮询的工作方式(据我所知)是你打开到服务器的TCP连接,服务器在通过套接字发回数据之前暂停。您发现可以在移动电话网络上运行的心跳间隔(我听说大约8分钟有效吗?)如果没有更新的数据,您会发送一个空包。
这就是我的麻烦所在。我无法弄清楚如何将客户端的数据请求与服务器上运行的事件处理程序“链接”...
流程应该是这样的(“客户”在手机上):
用户启动我的应用程序
如果数据发生了变化,客户端会发送通知请求
服务器“链接”(注册)客户端的套接字对象到“事件处理程序”,由我所谈到的服务器的其他TCP连接调用!
事件
o如果已触发(新数据已到达),请将数据发送到客户端
o如果未触发(无新数据),请向客户端发送“EmptyChanges”数据包
客户端在手机上接收数据并对其进行处理(根据收到的数据包类型调用事件处理程序,并将从服务器获取的“数据”传递给它)
如果数据发生了变化,客户端会发送通知请求
所以,我的问题是我无法想象一个能够实现我想要它的设计。问题是我不知道如何做#3。如何从另一个事件处理程序“链接”?这些几乎可以保证在不同的线程上运行!
所以,我的应用程序看起来像这样(所有的伪代码):
Class AppClass
{
Main()
List<Client> clients;
List<DataServers> dataServers;
DataReceivedFromServer(Data stuff)
{
}
MessageReceivedFromPhone(PhoneMessage pm, object sender)
{
//Loop here until HeartBeat interval reached
Int totalTime = 0;
While(totalTime < HEARTBEAT_INTERVAL)
{
If( ) // If we have received data from the server, and the client WANTED that data, send it now
{
}
}
}
}
那种?我希望它是事件驱动的,但我有最大的时间来弄清楚如何使用PUSH驱动的风格来驱动应用程序而不是我用于轮询的方式。
请你好心,因为我可能会做一些过于复杂和愚蠢的事情,因为这是我第一次真正尝试使用Socket编程(从来不需要它)而且由于手机在瞬态网络上的性质而且特别困难服务器需要通过OPEN TCP连接维护这些电话的位置。
服务器平台:Windows
服务器语言:C#
测试客户端平台:Windows
测试客户端语言:C#
目标客户端平台:Windows Mobile 6.5,iPhone,Android(客户端将单独编写)
目标客户端语言:C#,Obj-C或MonoTouch,Java
答案 0 :(得分:0)
只是有人想知道这一点,我破坏了编写自定义TCP服务器来管理我的连接的想法。这样做有很多开销,我基本上是在复制编写自己的HTTP服务器,所以不是这样做,而是将Python中的Web Tornado框架作为我的服务器,并编写后端服务以通过HTTP进行通信Web Tornado中的请求。
根本不使用Long轮询,我将使用SMS进行推送通知。我相信所有主要的手机平台都实现类似于你编写的SMS拦截器...如果某种格式的短信通过,它将运行你的自定义代码。这允许我删除使用一致的打开连接的要求(除了实时聊天,这将使用彗星样式长轮询,但连接只能在活动约5分钟时保持打开。)
基本上,Web Tornado框架在我的架构中充当企业总线。