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):
utilisateur démarre mon application
client envoie une requête à notifier si les données ont changé
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é!
é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
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)
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
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
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
@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! –