IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

Sockets, iPhone simulator [Développement]


Sujet :

Objective-C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Par défaut Sockets, iPhone simulator
    Bonjour,

    J'essaye de faire communiquer mon appli iPhone avec un serveur TCP à l'aide d'une socket. N'ayant pas d'iPhone sous la main j'utilise le simulateur.

    Question : est-ce que le simulateur prend en charge les sockets ? a m'étonnerait fort qu'il ne le fasse pas.

    En fait mon serveur ne reçoit jamais la connexion, et encore moins les données. Voici le code pour l'ouverture de la connexion, ça vient grosso modo de la doc Apple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    - (void)openConnection:(NSString *)url{
    	NSLog(@"Opening connection with %@", url);
    	if ([url isEqualToString:@""])
    		return;
    	NSURL *server = [NSURL URLWithString:url];
    	if (!server){
    		NSLog(@"Bad address: %@", url);
    		return;
    	}
     
    	CFReadStreamRef readStream;
    	CFWriteStreamRef writeStream;
    	CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)[server host], 1551, &readStream, &writeStream);
     
    	if (readStream == nil || writeStream == nil)
    		NSLog(@"Connexion error");
     
    	inputStream = (NSInputStream *)readStream;
    	outputStream = (NSOutputStream *)writeStream;
    	[inputStream setDelegate:self];
    	[outputStream setDelegate:self];
    	[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    	[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    	[inputStream open];
    	[outputStream open];
    	NSLog(@"Should be connected");
     
    	[self sendString:@"test"];
    }
    Et voici ma méthode pour envoyer un message à travers la socket.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -(void)sendString:(NSString *)string {
    	const uint8_t *rawstring = (const uint8_t *)[string UTF8String];
    	[outputStream write:rawstring maxLength:strlen(rawstring)];
    }
    D'après la doc la socket devrait être ouverte quand les streams sont ouverts. Je suis nouveau en Objective-C et développement iPhone, j'ai du mal à saisir la philosophie qui se cache derrière. J'ai l'habitude des sockets en C et Java qui n'ont rien de bien sorcier.

    Je précise que les méthodes sont bien appelées et streams semblent être bien instanciés.

    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Par défaut
    Réponse partielle : ne pas passer pas NSURL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)url, 1551, &readStream, &writeStream);
    Maintenant quand j'écris ça flush pas, le message n'est envoyé que lorsque je quitte l'appli. Je vais regarder du côté du callback.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Metal Tom Voir le message
    Réponse partielle : ne pas passer pas NSURL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)url, 1551, &readStream, &writeStream);
    Maintenant quand j'écris ça flush pas, le message n'est envoyé que lorsque je quitte l'appli. Je vais regarder du côté du callback.
    NSStream open:

    "Implement open to open the stream for reading or writing and make the stream available to the client directly or, if the stream object is scheduled on a run loop, to the delegate."

    si vous voulez écrire/lire directement, il ne faut pas appeler "scheduleInRunLoop" qui sous-entend que vous avez l'intention de travailler en asynchrone via le "delegate"…

  4. #4
    Membre éprouvé Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Par défaut
    Merci pour ta réponse.
    J'ai enlevé les scheduleInRunLoop mais ça ne change rien malheureusement.

    J'ai essayé d'utiliser des NSFileHandle à la place comme expliqué là dessus : http://iphonedevelopment.blogspot.co...ions-with.html

    Mais sans succès.

  5. #5
    Membre éprouvé Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Par défaut
    Bon à chercher loin on en oublie les bases. Un petit \n à la fin du message envoyé et ça flush.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Metal Tom Voir le message
    Bon à chercher loin on en oublie les bases. Un petit \n à la fin du message envoyé et ça flush.
    c'est pas une question de flush… NSOutputStream est "byte-oriented" et ne s'occupe pas de la sémantique du stream de bytes… il ne faut pas croire ou laisser que mettre un "\n" dans un flux provoque un flush.

    Ce que vous indiquez comme solution, signifie plutôt que c'est vous qui ne respectiez pas les règles du jeu du logiciel qui écoute à l'autre bout : lui s'attend à recevoir à "\n" comme "fin de ligne" avant de faire quoi que ce soit.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. iPhone Socket UDP
    Par MissTitou dans le forum Objective-C
    Réponses: 3
    Dernier message: 19/07/2011, 09h11
  2. [Sockets] Simuler un échange réseau en local
    Par Deaf dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 09/02/2009, 18h32
  3. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  4. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40
  5. Simulation de transmission de paquet entre différent réseaux
    Par MelloW dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 19h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo