2010-07-20 3 views
2

J'ai construit une application iPhone, qui capture la voix et diffusée sur le serveur en utilisant NSOutputStream instance. Une fois le flux arrêté, l'iPhone envoie un message texte en tant que "--- end ---" au serveur et commence à la liste sur NSOutputStream. Lorsque le serveur (construit à l'aide de C#) a capturé le message "--- end ---", il effectue un traitement et réécrit le texte au client. Une fois que le client reçoit le message de fin, il ferme les connexions NSOutputStream et NSInputStream.Comment faire un programme de communication client-serveur parfait en utilisant l'iPhone et C#

Chaque fois, avant d'envoyer le message "end", j'ai mis l'application en veille pendant 0,5 s. Ensuite, je peux garantir que le message final n'est pas mélangé avec d'autres données. Ce système fonctionne bien avec le simulateur et dans mon réseau (100 Mbps).

Cependant, lorsque j'ai connecté l'ensemble de l'application pour ralentir le réseau (1,2 Mbps), toute la communication a disparu. Parfois, le message final se mélange avec les données vocales, de la même manière que le message final est concaténé avec l'envoi de texte à partir du serveur. Mais quand je change le temps de sommeil de fil pendant 3 sec dans le serveur et le client, le taux d'occurrence d'erreur a été réduit.

Je sais que cela pourrait être un problème de conception de mon protocole de communication client-serveur réseau. Mais je ne peux pas comprendre comment le réparer exactement.

Quelqu'un peut-il m'expliquer, comment puis-je surmonter ces problèmes?

Répondre

1

Déterminez comment attendre que le transfert se termine, au lieu d'ajouter un temps de sommeil arbitraire.

+1

@chatcja Ceci est la définition d'une "condition de concurrence", et elle devrait être évitée. Vous devriez avoir une classe qui "gère" la connexion, et peut-être déclencher un événement pour votre application à recevoir. Si vous essayez de "chronométrer" ceci, cela ne fonctionnera jamais de manière cohérente. J'espère que cela pourra aider. –

+0

Merci pour l'information. Mais le problème que j'ai eu initialement était, iPhone -> C# parfois le message de fin est ajouté avec les données vocales. C# -> iPhone Le message de fin est ajouté au texte obtenu. Avez-vous un idéal pour envoyer le message final seul? – chatcja

+0

Quand vous dites "message texte", voulez-vous dire un SMS, ou voulez-vous dire qu'il ajoute du texte dans le flux TCP? TCP ne conserve pas les limites de message. Vous devez ajouter votre propre mécanisme pour séparer les composants de la conversation, comme préfixer chacun d'entre eux avec sa longueur. –

Questions connexes