我正在尝试编写一个基于自定义 TCP 的长轮询服务器,它将充当其他 TCP 连接的中间人,这些连接需要比手机所能提供的更多持久性。

我尝试的方法是用 C# 编写一个异步 TCP 服务器,并用 C# 编写一个匹配的 TCP 客户端。

长轮询的工作方式(据我所知)是打开一个到服务器的 TCP 连接,服务器在通过套接字发送回数据之前停止。你找到一个适用于移动电话网络的心跳间隔(我听说8分钟左右可以?),如果没有更新的数据,你会发送一个空数据包。

这就是我的麻烦所在。我不知道如何将客户端的数据请求与服务器上运行的事件处理程序“链接”......

流程应该是这样的(“客户端”在电话上):

  1. 用户启动我的应用程序

  2. 客户端发送请求以在数据发生更改时得到通知

  3. 服务器将客户端的套接字对象“链接”(注册)到一个“事件处理程序”中,该处理程序由我谈到的服务器的其他 TCP 连接调用!

  4. 事件

    o 如果被触发(新数据到达),则将数据发送给客户端

    o 如果没有触发(没有新数据),则向客户端发送“EmptyChanges”数据包

  5. 客户端在手机上接收数据并对其进行处理(根据收到的数据包类型调用事件处理程序,并将从服务器获得的“数据”传递给它)

  6. 客户端发送请求以在数据发生更改时得到通知

所以,我的问题是我想不出一种设计可以实现我想要的功能。问题是我不知道如何做#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 驱动风格与普通驱动风格来驱动应用程序。我“习惯”的轮询。

请善待我,因为我可能会做一些过于复杂和愚蠢的事情,因为这是我第一次真正尝试使用套接字编程(从来不需要它),而且由于手机在瞬态网络上的性质以及我的服务器需要通过 OPEN TCP 连接维护这些电话的位置。

服务器平台:视窗

服务器语言:C#

测试客户端平台:视窗

测试客户端语言:C#

目标客户平台:Windows Mobile 6.5、iPhone、Android(客户端将单独编写)

目标客户语言:C#、Obj-C 或 MonoTouch、Java

有帮助吗?

解决方案

对于任何想知道这一点的人来说,我放弃了编写自定义 TCP 服务器来管理我的连接的想法。这样做的开销太大了,我基本上是在重复编写自己的 HTTP 服务器,所以我没有这样做,而是使用 Python 中的 Web Tornado 框架作为我的服务器,并编写后端服务以通过 HTTP 进行通信Web Tornado 中的请求。

我将使用 SMS 进行推送通知,而不是使用长轮询。我相信所有主要的电话平台都实现了类似于您编写的短信拦截器的功能......如果某种格式的短信通过,它将运行您的自定义代码。这使我能够消除使用一致的打开连接的要求(实时聊天除外,它将使用彗星样式的长轮询,但连接只有在活动大约 5 分钟时才能保持打开状态。)

基本上,Web Tornado 框架在我的架构中充当企业总线。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top