2009-11-13 8 views
0

J'essaie d'écrire un serveur d'interrogation longue basé sur TCP personnalisé qui servira d'intermédiaire pour d'autres connexions TCP qui requièrent plus de persistance qu'un téléphone mobile ne peut fournir. La façon dont j'essaye de le faire est d'écrire un serveur TCP asynchrone en C# et un client TCP correspondant écrit en C#.Génération d'événements sur un serveur TCP longue durée personnalisé

La façon dont fonctionne l'interrogation longue (autant que je sache) est que vous ouvrez une connexion TCP à un serveur et que le serveur s'arrête avant d'envoyer des données à travers le socket. Vous trouvez un intervalle de battement de coeur qui fonctionne sur un réseau de téléphonie mobile (j'ai entendu dire qu'environ 8 minutes fonctionne?) Et vous envoyez un paquet vide s'il n'y a pas de données mises à jour.

C'est là ma peine vient. Je ne peux pas comprendre comment « lien » 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. utilisateur démarre mon application

  2. client envoie une requête à notifier si les données ont changé

  3. Le serveur "lie" (enregistre) l'objet socket du client dans un "Event handler" qui est appelé par les autres connexions TCP du serveur dont j'ai parlé!

  4. é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), envoyez un « EmptyChanges » paquet au client

  5. 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 à notifier si les données ont changé donc

, 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 "lier" un gestionnaire d'événements à un autre? Et ceux-ci sont presque garantis de fonctionner sur des threads différents!

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

Type de? Je veux que cela soit piloté par les événements, mais je vais avoir le plus de mal à comprendre comment piloter l'application avec un style piloté par PUSH par rapport à ce à quoi je suis "habitué" de Polling. S'il vous plaît, soyez gentil comme je pourrais faire quelque chose de trop compliqué et stupide parce que c'est ma première vraie tentative d'utilisation de la programmation Socket (jamais nécessaire) et c'est particulièrement difficile en raison de la nature des téléphones cellulaires sur les réseaux transitoires. mon serveur ayant besoin de maintenir l'emplacement de ces téléphones avec une connexion OPEN TCP.

plate-forme de serveur: Windows

langue du serveur: C#

plateforme 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)

Client cible langage: C#, Obj-C ou MonoTouch, Java

+0

Tous les clients doivent-ils recevoir les mêmes données ou les données sont-elles différentes pour chaque client? Si les données sont identiques, une simple diffusion pourrait être la méthode la plus simple: vous "marquez" simplement votre client comme "écouteur" (simple boolean isListener ou quelque chose) et puis quand les données arrivent, vous faites simplement une boucle dans la liste des clients les données – Noctris

+0

By The Way: Cela ressemble beaucoup à une file d'attente de messages. Nous avons une chose similaire en cours d'exécution ici pour un but complètement différent, mais l'idée est la même. Vous pouvez utiliser le courtier de messages ActiveMQ et configurer simplement votre téléphone pour écouter un certain sujet. Lors d'un événement, vous envoyez le message (données) sur ce sujet. En prime, la connexion avec ActiveMQ est assez stable (en utilisant leur client) et vous n'avez pas besoin de plonger dans le monde illuster de garder des connexions tcp sur de mauvaises connexions réseau/téléphone qui peuvent être un réel PITA – Noctris

+0

@Noctris: This ActiveMQ semble très très intéressant. En attendant plus de recherches, je pense que vous avez peut-être trouvé exactement ce que je cherchais, je ne savais pas trop comment mettre ce dont j'avais besoin en termes standard et autres. Je vous donnerai plus de détails sur l'implémentation de couche ActiveMQ Transport (je pense qu'ils ont utilisé le terme Publisher), et si je peux la personnaliser comme j'en ai besoin alors ce serait parfait! –

Répondre

0

Juste quelqu'un se demandant cela, j'ai trébuché l'idée d'écrire un serveur TCP personnalisé pour gérer mes connexions. Je faisais de la réplication en écrivant mon propre serveur HTTP, donc au lieu de faire ça, je suis allé avec le framework Web Tornado en Python comme serveur et j'écris les services back-end pour communiquer via HTTP demandes dans 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 majeures implémenter quelque chose de similaire à un SMS Interceptor que vous écrivez ... si un SMS d'un certain format vient à travers, il va exécuter votre code personnalisé. Cela me permet de supprimer les exigences d'utilisation de connexions ouvertes cohérentes (autres que pour le chat en direct, qui utilisera un sondage long de type comète, mais la connexion ne peut rester ouverte que si elle dure environ 5 minutes). Le framework Web Tornado sert de bus Enterprise dans mon architecture.

Questions connexes