Question

Je suis en train d'écrire un serveur d'interrogation à long TCP personnalisé qui servira d'intermédiaire pour d'autres connexions TCP qui nécessitent plus de persistance qu'un téléphone mobile peut fournir.

La façon dont je suis en train de le faire est en train d'écrire un serveur TCP asynchrone en C # et un client TCP correspondant également écrit en C #.

La façon dont les travaux de longue de vote (pour autant que je le comprends) est que vous ouvrez une connexion TCP à un serveur, et le serveur avant d'envoyer des données HALTS retour dans la prise. Vous trouverez un intervalle de rythme cardiaque qui fonctionne sur un réseau de téléphonie mobile (je l'ai entendu dire que 8 minutes fonctionne?) Et vous envoyez un paquet vide s'il n'y a pas de données mises à jour.

est où mon problème vient. Je ne peux pas comprendre comment « lien » à la demande de mon client pour les données avec un gestionnaire d'événements en cours d'exécution sur le serveur ...

Le débit doit être quelque chose comme ça ( « client » est sur un téléphone):

  1. L'utilisateur commence mon application

  2. Le client envoie une demande pour être informé si les données ont changé

  3. serveur « liens » (registres) l'objet socket du client dans un « gestionnaire d'événements » qui est appelé par d'autres connexions TCP du serveur que je vous ai parlé!

  4. L'événement

    o Si elle est déclenchée (nouvelles données est arrivé), Envoyez les données au client

    o Si elle ne se déclenche pas (pas de nouvelles données), envoyer un paquet « EmptyChanges » au client

  5. Le client reçoit des données sur le téléphone et la traite (appelle un gestionnaire d'événements en fonction de ce type de paquet reçu et transmet les « données », il a du serveur à elle)

  6. Le client envoie une demande pour être informé si les données ont changé

Alors, mon problème est que je ne peux pas penser à une conception qui permettra d'accomplir ce que je veux faire. Le problème est que je ne sais pas comment faire # 3. Comment puis-je « Link » un gestionnaire d'événements d'une autre? Et ceux-ci sont presque garantis d'être en cours d'exécution sur différents sujets!

Alors, ma demande ressemblerait à quelque chose comme ça (tout 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
            {
            }
        }
    }
}

Un peu? Je veux que ce soit l'événement conduit, mais je vais avoir le temps damndest déterminer comment conduire l'application d'une simple pression de style conduit par rapport à ce que je suis « utilisé » à des Polling.

S'il vous plaît, être gentil que je pourrais faire quelque chose de trop compliqué et stupide parce que c'est ma première véritable tentative en utilisant la programmation Socket (jamais nécessaire) et il est particulièrement difficile en raison de la nature des téléphones cellulaires étant sur les réseaux transitoires et ma serveur besoin de maintenir l'emplacement de ces téléphones avec une connexion TCP ouverte.

  

Plate-forme de serveur: Windows

     

Langue du serveur: C #

     

Plate-forme Client test: Windows

     

Test de langue du client: C #

     

Plate-forme client cible: Windows Mobile 6.5, iPhone, Android (les clients seront écrits séparément)

     

Langue client cible: C #, Obj-C ou MonoTouch, Java

Était-ce utile?

La solution

Juste ceux qui se demandent, je saccagé l'idée d'écrire un serveur TCP personnalisé pour gérer mes connexions. Il y avait tellement de frais généraux à faire cela, je essentiellement être répliquez écrire mon propre serveur HTTP, donc au lieu de le faire, je suis allé avec le cadre Tornado Web en Python que mon serveur et je écris les services de back-end pour communiquer via HTTP demandes de Web Tornado.

Au lieu d'utiliser l'interrogation longue du tout, je vais utiliser SMS pour les notifications push. Je crois que toutes les plates-formes téléphoniques majeurs mettre en œuvre quelque chose de semblable à un intercepteur de SMS que vous écrivez ... si un SMS d'un certain format passe par, il sera exécuté votre code personnalisé. Cela me permet de supprimer les exigences de l'utilisation des connexions cohérentes ouvertes (autres que pour le chat en direct, qui utiliseront un style comète sondage Long, mais la connexion ne peut rester ouverte si elle est active pendant environ 5 minutes.)

En fait, le cadre Tornado Web sert comme un bus d'entreprise dans mon architecture.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top