NSStream Probleme d'ecriture sur le stream Output

LastikoLastiko Membre
13:09 modifié dans API UIKit #1
Bonjour

je viens enfin de reussir a me connecter a mon systéme de domotique sur le port qui m'interesse mais je n'arrive pas a ecrire des données sur ce port

j'ai utiliser NSSTream qui marche nikel d'ailleur mais je comprends pas comment simplement ecrire sur le stream Output par exemple TOTO ( pour faire simple ) via un bouton

si quelqu'un a deja jouer avec NSStream ca m'aiderai beaucoup

merci par avance

Lastiko

Réponses

  • LastikoLastiko Membre
    13:09 modifié #2
    je vais mettre le code ca va etre peut etre plus simple


    alors pour connecter , je fais ca

    -(IBAction)Connection<br />{	<br />	NSLog(@&quot;in connect to host!&quot;);<br />	<br />	//NSString *urlStr = @&quot;192.168.0.110&quot;;<br />	NSHost *host = [NSHost hostWithAddress:@&quot;192.168.0.110&quot;];<br />	if (host != nil)<br />	{		<br />		// iStream and oStream are instance variables<br />		[NSStream getStreamsToHost:host port:5000 inputStream:&amp;iStream outputStream:&amp;oStream];<br />		<br />		//iStream is instance var of NSSInputStream<br />		[iStream retain];<br />		[iStream setDelegate:self];<br />		[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];<br />		[iStream open];<br />		<br />		//oStream is instance var of NSSOutputStream<br />		[oStream retain];<br />		[oStream setDelegate:self];<br />		[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];<br />		[oStream open];		<br />		<br />		NSError *streamError;<br />		streamError = [iStream streamError];<br />		streamError = [oStream streamError];<br />		<br />		NSStreamStatus streamStatus;<br />		streamStatus = [iStream streamStatus];<br />		streamStatus = [oStream streamStatus];<br />	}<br />}<br />
    


    je vois bien sur la connection monter sur ce port 5000 sur le systéme de domotique ( jusque la tout va bien  ;D )

    ensuite pour la déconnection

    -(IBAction)Deconnection<br />{	<br />	[iStream close];<br />	<br />	[iStream removeFromRunLoop:[NSRunLoop currentRunLoop]<br />	 <br />					&nbsp; forMode:NSDefaultRunLoopMode];<br />	<br />	[iStream release];<br />	<br />	[oStream close];<br />	<br />	[oStream removeFromRunLoop:[NSRunLoop currentRunLoop]<br />	 <br />					&nbsp;  forMode:NSDefaultRunLoopMode];<br />	<br />	[oStream release];<br />	<br />	NSLog(@&quot;close connect to host!&quot;);<br /><br />}
    


    idem ca marche


    la gestion des events
    - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent<br />{<br />	NSString *io;<br />	<br />	if (theStream == iStream) io = @&quot;&gt;&gt;&quot;;<br />	else io = @&quot;&lt;&lt;&quot;;<br />	<br />	NSString *event;<br />	switch (streamEvent)<br />	{<br />		case NSStreamEventNone:<br />			event = @&quot;NSStreamEventNone&quot;;<br />			NSLog(@&quot;Can not connect to the host!&quot;);<br />			break;<br />		case NSStreamEventOpenCompleted:<br />			event = @&quot;NSStreamEventOpenCompleted&quot;;<br />			break;<br />		case NSStreamEventHasBytesAvailable:<br />			event = @&quot;NSStreamEventHasBytesAvailable&quot;;<br />			if (theStream == iStream)<br />			{<br />				uint8_t buffer[1024];<br />				int len;<br />				while ([iStream hasBytesAvailable])<br />				{<br />					len = [iStream read:buffer maxLength:sizeof(buffer)];<br />					if (len &gt; 0)<br />					{<br />						NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];<br />						if (nil != output)<br />						{<br />						//	bufferArray = [[NSArray alloc] init];<br />						//	bufferArray = [output componentsSeparatedByString:@&quot;&#092;n&quot;];<br />							NSLog(@&quot; donnée entrante : %@ &quot;, output);<br />							[output release];<br />						}<br />					}<br />				}<br />			}<br />			break;<br />		case NSStreamEventHasSpaceAvailable:<br />			event = @&quot;NSStreamEventHasSpaceAvailable&quot;;<br />			if (theStream == oStream)<br />			{<br />				//uint8_t buffer[11] = &quot;setmode 1&#092;r&#092;n&quot;;<br />				uint8_t buffer2[124] = &quot;connection reussie&#092;r&#092;n&quot;;<br />				int len;<br />				<br />				//len = [oStream write:buffer maxLength:sizeof(buffer)];<br />				len = [oStream write:buffer2 maxLength:sizeof(buffer2)];<br />				if (len &gt; 0)<br />				{<br />					NSLog(@&quot;Command send&quot;);<br />					[oStream close];<br />				}<br />			}<br />			break;<br />		case NSStreamEventErrorOccurred:<br />			event = @&quot;NSStreamEventErrorOccurred&quot;;<br />			NSLog(@&quot;Can not connect to the host!&quot;);<br />			break;<br />		case NSStreamEventEndEncountered:<br />			event = @&quot;NSStreamEventEndEncountered&quot;;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [theStream close];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [theStream release];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; theStream = nil;<br />			<br />			break;<br />		default:<br />			event = @&quot;** Unknown&quot;;<br />	}<br />	<br />	NSLog(@&quot;%@ : %@&quot;, io, event);<br />}<br />
    


    bon la y a un truc qui arrive sur le systeme de domotique quand ca connect
    je lis ca "connection reussie\r\n"

    j'ai donc repris la partie qui envoie ca et mise dans un bouton mais ca veut pas le refaire en envoyant TOTO par exemple mais rien a faire
    meme google m'a pas aidé sur le coup ( ce salopard lol )

    Si quelqu'un pouvait m'aiguiller , je serais ravi  :why?:
  • NoNo Membre
    avril 2009 modifié #3
    Je n'ai pas tout saisi.
    Apparemment, à  partir de la méthode action d'un bouton, tu ne peux plus renvoyer des données dans ton NSOutputStream, non ?

    Que te renvoient les différents status et autres messages d'erreur ?

    <br />- (void)bouton:(id)sender<br />{<br />   NSString *toto=@&quot;toto&#092;r&#092;n&quot;;<br /><br />   if ([oStream hasSpaceAvailable])<br />   {<br />      NSInteger i=[oStream write:[toto cStringUsingEncoding:NSASCIIStringEncoding] maxLength:[toto lengthOfBytesUsingEncoding:NSASCIIStringEncoding]];<br />      if (i&lt;0)<br />      {<br />         NSLog(@&quot;erreur lors de l&#39;envoi, status:%i, erreur:%@&quot;, [oStream streamStatus], [oStream streamError]);<br />      }<br />   }<br /><br />   else<br />   {<br />   	NSLog(@&quot;impossible d&#39;envoyer, status:%i, erreur:%@&quot;, [oStream streamStatus], [oStream streamError]);<br />   }<br />}<br />
    


    EDIT : correction d'une faute de frappe dans le code...
  • LastikoLastiko Membre
    13:09 modifié #4
    c'est ca j'arrive pas a envoyer des données sur NSOutputStream

    :D
    merci pour le coup de main
  • NoNo Membre
    13:09 modifié #5
    dans 1238598435:

    c'est ca j'arrive pas a envoyer des données sur NSOutputStream


    et que donnent les message d'erreur/status ?
  • LastikoLastiko Membre
    13:09 modifié #6
    ton exemple marche pas :(
  • NoNo Membre
    13:09 modifié #7
    dans 1238599389:

    ton exemple marche pas


    Il va falloir que tu sois un peu plus causant si tu veux qu'on t'aide.

    Ca veut dire quoi "ça marcha pas" ?
    Plantage ? erreur à  la compil ?
    Qu'affiche la log ?
  • LastikoLastiko Membre
    13:09 modifié #8
    désolé

    ca donne une erreur de compli

    " error : error syntax before";"token

    voila l'erreur que ca donne apres ca

    NSInteger i=[oStream write:[toto cStringUsingEncoding:NSASCIIStringEncoding] maxLength:[toto lengthOfBytesUsingEncoding:NSASCIIStringEncoding];
  • NoNo Membre
    13:09 modifié #9
    C'est pas difficile de voir qu'il manque un crochet (faute de frappe de ma part) avant le point-virgule...
  • LastikoLastiko Membre
    13:09 modifié #10
    pas reveillé non plus :D
  • LastikoLastiko Membre
    13:09 modifié #11
    effectivement ca marche mieux par contre ca envoie pas les données mais ca me dit ca

    2009-04-01 18:27:10.091 clientServeur[1294:20b] ouverture de la connection<br />2009-04-01 18:27:10.291 clientServeur[1294:20b] &gt;&gt; : NSStreamEventOpenCompleted<br />2009-04-01 18:27:10.299 clientServeur[1294:20b] &lt;&lt; : NSStreamEventOpenCompleted<br />2009-04-01 18:27:10.304 clientServeur[1294:20b] Command send<br />2009-04-01 18:27:10.308 clientServeur[1294:20b] &lt;&lt; : NSStreamEventHasSpaceAvailable<br />2009-04-01 18:27:24.576 clientServeur[1294:20b] impossible d&#39;envoyer, status:6, erreur:Error Domain=NSUnknownErrorDomain Code=0 &quot;Operation could not be completed. (NSUnknownErrorDomain error 0.)&quot;<br />2009-04-01 18:27:25.585 clientServeur[1294:20b] impossible d&#39;envoyer, status:6, erreur:Error Domain=NSUnknownErrorDomain Code=0 &quot;Operation could not be completed. (NSUnknownErrorDomain error 0.)&quot;<br />
    


    etrange non ? tu as une idée docteur No  ;D
  • NoNo Membre
    13:09 modifié #12
    dans 1238603448:

    etrange non ? tu as une idée docteur No  ;D


    Bah ouais que j'ai une idée...
    Tu devais toujours pas être réveillé quand tu as pondu ton code, non ?

    Car dans le delegate stream:handleEvent:, quand tu reçois un événement NSStreamEventHasSpaceAvailable, tu émets une chaine "connexion reussie", puis si l'envoi a été correct (la valeur retournée par write:maxLength: est positive), tu fermes immédiatement ta connexion par un [oStream close]; !

    Donc inutile par la suite d'utiliser ton oStream.
  • LastikoLastiko Membre
    13:09 modifié #13
    merci beaucoup Docteur No

    effectivement ca marche maintenant ( le code c'est pas moi qui l'ai ecris je l'ai trouver sur le net )
  • LastikoLastiko Membre
    13:09 modifié #14
    bonjour

    j'ai un probleme sur la stabilité de la connection , l'application marche mais coupe au bout d'un certain temps

    en cherchant l'erreur je me suis rendu compte que dans la version 3 du SDK , il n'y a plus NSHost et forcément ca me mets deux warning

    warning no '+ hostWithAddress' method found

    et

    warning 'NSStream' may not respond to '+ getStreams ToHost:port:inputStream:outputStream'

    :(
    je me demande si ca ne viendrait pas de ca mon soucis
  • LastikoLastiko Membre
    13:09 modifié #15
    bon en passant par CFStreamCreatePairWithSocketToHost ca va mieux
    mais ca deconnecte toujours au bout d'un moment

    erreur NSPOSIXErrorDomaine code = 54

    :o
  • LastikoLastiko Membre
    mai 2009 modifié #16
    bon j'ai bataillé un peu plus
    on va dire que ca fait 3 jours que je suis sur ce probleme

    la je viens de reprendre mon prog complement

    dans le simulateur la connection tiens 1h30 sans soucis ( enfin j'ai stopper le test apres 1 h 30 )

    mais dés que je teste dans l'ipod voila en 1 ou 2 minutes c'est mort , plus de connection :(

    est ce que quelqu'un peut m'aider la :(
  • h3630frh3630fr Membre
    13:09 modifié #17
    Salut,
    Moi j'ai des gros soucis pour implementer un petit client/serveur simple entre un iphone et un PC.

    Le pb n° 1 est qu'il faut du code des 2 cotés. Un du coté de l'Iphone (ObjC) et 1 du coté du PC (lequel ??)

    J'avais pense quelque chose de simple :
    L'iphone envoie une trame a un PC (sur appui bouton dans l'iphone) et celui ci renvoie a l'Iphone une trame de reponse quand il a fini de bosser (exemple si de l'iphone on envoi "toto", coté PC, on affiche "toto" dans un page HTML ou on stocke l'info dans une base SQlite par exemple)

    Quand le PC a terminé son traitement, il renvoie vers l'iphone un message que l'on affiche sur l'Iphone ("titi")

    quelqu'un pourrait m'aider (de maniere concrete). Eventuellement avec quelques bout de code qui marchent ?

    merci de votre retour car ce n'est pas tres evident sur l'Iphone.

    A priori, je dois etre sur le bon forum
  • zoczoc Membre
    13:09 modifié #18
    dans 1246395224:

    A priori, je dois etre sur le bon forum

    Certes, mais pas la peine de poster 3 fois la même question...
  • h3630frh3630fr Membre
    13:09 modifié #19
    je ne savais pas dans quel post le mettre car il y en a 3 qui parle un peu du meme pb.
    Mais cela dit tu as raison.
    je ferais attention
Connectez-vous ou Inscrivez-vous pour répondre.