Stream Obtenir des Données - NSInputStream
Tous,
J'ai un serveur qui a un socket tcp stream pour la communication. J'ai besoin d'obtenir à ce flux et de lire les données initiales qu'il doit m'envoyer.
Mon code est comme suit. Pour être honnête, je vais à présent complètement aveugle. Je ne sais pas si cela est correct sans parler de la bonne chose pour l'emploi.
-(void) initNetworkCommunication
{
//input stream
NSInputStream *iStream;
NSURL *url = [url initWithString:@"192.168.17.1:2004"];
[iStream initWithURL:url];
[iStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[iStream open];
}
Donc, à partir de la façon dont je le vois, ce code initialise le flux, mais comment puis-je lire le stream?
Grâce
- Le codeblock ne semble pas bien attribuer les
NSInputStream
objet (c'est à dire il y a uninit
mais pasalloc
).
Vous devez vous connecter pour publier un commentaire.
Il y a deux façons d'obtenir des données à partir d'un flux: l'interrogation et à l'aide de flux d'événements.
Interrogation est plus simple, mais va bloquer le thread qu'il est en cours d'exécution. Si vous utilisez cette méthode, vous n'avez pas besoin d'effectuer la
setDelegate:
ouscheduleInRunLoop:forMode:
appels. Bureau de vote est effectué à plusieurs reprises d'appelerread:maxLength:
.À l'aide de flux d'événements nécessite la définition d'un délégué et d'ajouter le flux à une course en boucle. Au lieu de bloquer le thread, le flux envoyer un
stream:handleEvent:
message à son délégué lorsque certains événements se produisent, y compris lorsqu'il reçoit des données. Le délégué peut ensuite récupérer les données dans le flux. Voici un exemplestream:handleEvent:
méthode:read:maxLength:
à l'intérieur la si-stmt, vous n'aurez plus jamais rien lu de si vous réussissez à obtenir le flux de la mémoire tampon interne. Mais je ne suis pas assez solide sur le sujet pour le modifier moi-pouvez-vous le corriger, s'il vous plaît?getBuffer
méthode?read:maxLength:
consiste à copier les données dans une mémoire tampon temporaire créé à l'intérieur de l'instruction if. Vous avez seulement besoin de faire cela si vous n'en avez pas déjà un tampon avec les données qu'il contient. Immédiatement après l'instruction if, vous devez ajouter le code pour faire quelque chose avec les données dans la mémoire tampon, parce que la mémoire tampon n'est que temporaire. NSOutputStream n'a probablement pas fournir l'accès à une mémoire tampon interne car elle ne permet pas l'accès aux données que vous avez déjà écrit, et si vous avez écrit directement dans la mémoire tampon, il n'aurait aucun moyen de savoir qu'il doit envoyer les données.read:maxlength
à mettre les données en elle.)removeFromRunLoop
en outre àclose
dans leif (shouldClose)
bloc?Je suis venu avec ce, sur la base d'autres réponses.