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

  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 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 966
    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 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 966
    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.

  7. #7
    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
    En effet, de l'autre côté mon serveur (JAVA) fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer = istream.readLine()
    Donc si j'ai bien compris les NSOutputStream envoient directement, c'est pas bufferisé ?

    Sinon j'ai pas encore testé la lecture.

  8. #8
    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
    Re.

    Pour la lecture j'ai fait ça comme dans les tutos : j'utilise un callback dans une boucle, et je fais tout à la main dans le handleEvent.

    Par contre une fois déployé j'ai un petit souci. quand je me connecte sur mon serveur, celui-ci reçoit la demande de connexion, suivi d'un Connection reset (IOException, JAVA). Ça ne le fait pas avec le simulateur. Pour info je teste sur un iPod touch avec iOS 3.1.3.

    Edit : j'ai testé avec un iPhone et iOS 3.1.3 et pareil : connection reset.

  9. #9
    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 apparemment c'était un problème annexe. Mon serveur tournait sur une machine virtuelle. Tant que j'essayais avec la même machine physique ça passait. Par contre de l'extérieur la machine faisait firewall pour protéger la machine virtuelle et donc ça déconnectait.

    J'ai essayé en lançant mon serveur sur une autre machine sans machine virtuelle et l'iPhone/iPod s'y connecte sans soucis.

    Je crois que c'est tout pour moi, merci.

+ 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, 10h11
  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, 19h32
  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, 14h02
  4. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 01h40
  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, 20h51

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