Frage

Ich versuche, einen benutzerdefinierten TCP-basierte lange Abfrageserver zu schreiben, die als go-between für andere TCP-Verbindungen dienen, die mehr Ausdauer benötigen, als ein Mobiltelefon zur Verfügung stellen kann.

So wie ich bin versucht, es zu tun, ist einen asynchronen TCP-Server in C # zu schreiben und ein passenden TCP-Client auch in C # geschrieben.

Die Art und Weise, dass lange Polling Arbeiten (soweit ich es verstehe) ist, dass Sie eine TCP-Verbindung zu einem Server öffnen und der Server-Halt vor Datensicherung über den Sockel zu senden. Sie finden ein Herzschlag-Intervall, das funktioniert auf einem Mobiltelefonnetz (Ich habe gehört, dass etwa 8 Minuten funktionieren?) Und ein leeres Paket zu senden, wenn es keine Daten aktualisiert werden.

Dies ist, wo meine Probleme kommen. Ich kann nicht herausfinden, wie „link“ Anfrage meines Klienten für Daten mit einem Event-Handler auf dem Server ausgeführt ...

Die Strömung sollte so etwas wie dieser ( „Client“ ist auf einem Telefon):

  1. Benutzer startet meine Anwendung

  2. Client sendet eine Anforderung benachrichtigt werden, wenn Daten geändert

  3. Server „Links“ (Register) Client-Socket-Objekt in einen „Ereignishandler“, das von dem Server des anderen TCP-Verbindungen genannt, dass ich darüber gesprochen!

  4. Ereignis

    o Wenn es ausgelöst wird (neue Daten angekommen ist), sendet die Daten an den Client

    o Wenn es nicht ausgelöst wird (keine neue Daten), senden „EmptyChanges“ Paket an Client

  5. Client empfängt Daten auf dem Telefon und Prozesse es (Anrufe ein Event-Handler basierend auf welche Art von Paket, das er empfangen und übergibt die „Daten“ vom Server, um es vor)

  6. Client sendet eine Anforderung benachrichtigt werden, wenn Daten geändert

Also, mein Problem ist, dass ich nicht von einem Entwurf denken kann, das wird erreichen, was ich will, es zu tun. Das Problem ist, dass ich weiß nicht, wie # 3 zu tun. Wie kann ich „Link“ ein Event-Handler von einem anderen? Und diese sind fast garantiert auf verschiedenen Threads ausgeführt werden!

Also, meine Anwendung wie folgt aussehen würde (alle psuedocode):

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
            {
            }
        }
    }
}

Art? Ich will es ereignisgesteuert sein, aber ich bin mit der damndest Zeit, herauszufinden, wie man mit einem PUSH angetrieben Stil gegen die Anwendung zu fahren, was ich „benutzt“, um von Polling bin.

Bitte, seine Art, wie ich etwas tun könnte übermäßig kompliziert und dumm, weil dies mein erster richtiger Versuch ist bei Verwendung von Socket-Programmierung (nie gebraucht), und es ist besonders schwer aufgrund der Art von Handys auf transiente Netzwerken sein und meine Server benötigen die Lage dieser Telefone mit einer offenen TCP-Verbindung aufrecht zu erhalten.

  

Server-Plattform: Windows

     

Server Sprache: C #

     

Test Client-Plattform: Windows

     

Test Client Sprache: C #

     

Ziel-Client-Plattform: Windows Mobile 6.5, iPhone, Android (Clients getrennt geschrieben wird)

     

Ziel-Client Sprache: C #, Obj-C oder Monotouch, Java

War es hilfreich?

Lösung

Nur jemand diese fragen, trashed ich die Idee, einen benutzerdefinierten TCP-Server zu schreiben, meine Verbindungen zu verwalten. Es gab so viel Aufwand, das zu tun, würde ich im Grunde meines eigenen HTTP-Server replizieren zu schreiben, so anstatt das zu tun, ging ich mit dem Web-Tornado Framework in Python als mein Server und schreibe die Back-End-Dienste über HTTP zu kommunizieren Anfragen in Web Tornado.

Stattdessen überhaupt Lange Abfrage zu verwenden, werde ich SMS verwenden, für Push-Benachrichtigungen. Ich glaube, dass alle wichtigen Telefonplattformen etwas ähnlich einen SMS Interceptor implementieren, dass Sie schreiben ... wenn eine SMS von einem bestimmten Format durchkommt, wird es Ihren eigenen Code ausführen. Dies ermöglicht es mich, die Anforderungen der Anwendung einheitliche offene Verbindungen zu entfernen (außer für Live-Chat, die einen Kometen Stil Lange Umfrage verwenden, aber die Verbindung bleibt nur offen, wenn aktiv für ca. 5 Minuten.)

Grundsätzlich ist der Web Tornado Framework wird als Enterprise-Bus in meiner Architektur dienen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top