2011-10-03 5 views
1

Merci d'avance à ceux qui voient ma question. Je suis nouveau à la programmation et aussi nouveau à la programmation d'Objective-c, je crée un client simple qui se connectera à un serveur de jour et demandera quelle heure et date il est alors l'imprimera à l'écran, j'ai regardé et ai lu beaucoup de tutoriels en ce moment et est venu avec le code ci-dessous mais j'ai un problème je ne peux pas lire l'entrée de l'utilisateur qui va entrer l'adresse du serveur et je vais utiliser cette adresse serveur pour se connecter au serveur ici est mon codeConnexion simple du client Iphone au serveur

mes codes de socket dans mon dossier Controller.m

@interface NSStream (MyAdditions) 

+ (void)getStreamsToHostNamed:(NSString *)hostName 
         port:(NSInteger)port 
        inputStream:(NSInputStream **)inputStreamPtr 
       outputStream:(NSOutputStream **)outputStreamPtr; 

@end 

@implementation NSStream (MyAdditions)    
+ (void)getStreamsToHostNamed:(NSString *)hostName 
         port:(NSInteger)port 
        inputStream:(NSInputStream **)inputStreamPtr 
       outputStream:(NSOutputStream **)outputStreamPtr 
{ 
    CFReadStreamRef  readStream; 
    CFWriteStreamRef writeStream; 

    assert(hostName != nil); 
    assert((port > 0) && (port < 65536)); 
    assert((inputStreamPtr != NULL) || (outputStreamPtr != NULL)); 

    readStream = NULL; 
    writeStream = NULL; 

    CFStreamCreatePairWithSocketToHost(
             NULL, 
             (CFStringRef) hostName, 
             port, 
             ((inputStreamPtr != nil) ? &readStream : NULL), 
             ((outputStreamPtr != nil) ? &writeStream : NULL) 
             ); 

    if (inputStreamPtr != NULL) { 
     *inputStreamPtr = [NSMakeCollectable(readStream) autorelease]; 
    } 
    if (outputStreamPtr != NULL) { 
     *outputStreamPtr = [NSMakeCollectable(writeStream) autorelease]; 
    } 
} 

@end 

mon adresse de connexion et le port

@implementation iPhoneClientViewController 

-(void) connect { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *address = [defaults stringForKey:@"Address"]; // this is default one 
    if(!address) address = @"localhost"; 
    NSLog(@"ADDRESS %@",address); 

    [NSStream getStreamsToHostNamed: address port:13 inputStream:&iStream outputStream:&oStream]; 
    [iStream retain]; 
    [oStream retain]; 
    [iStream setDelegate:self]; 
    [oStream setDelegate:self]; 
    [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [iStream open]; 
    [oStream open]; 
} 

mes valeurs par défaut sont

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
    <key>Title</key> 
    <string>iPhoneClient</string> 
    <key>StringsTable</key> 
    <string>Root</string> 
    <key>PreferenceSpecifiers</key> 
    <array> 
    <dict> 
     <key>Type</key> 
     <string>PSTextFieldSpecifier</string> 
     <key>Title</key> 
     <string>Server IP</string> 
     <key>Key</key> 
     <string>Address</string> 
     <key>DefaultValue</key> 
     <string>localhost</string> 
     <key>IsSecure</key> 
     <false/> 
     <key>KeyboardType</key> 
     <string>NumbersAndPunctuation</string> 
     <key>AutoCorrectType</key> 
     <string>No</string> 
    </dict> 
    </array> 
    </dict> 
</plist> 

i mettre un champ de texte à mon ViewController.m

-(BOOL)textFieldShouldReturn:(UITextField *)textField{ 
    NSLog(@"Text Field contents %@",textField.text); 
    [textField resignFirstResponder]; 
    return YES; 
} 

et lorsque le bouton cliqué i mis

- (IBAction)connectCommand:(id)sender { 
    // NSString *address = textField.text; // this is gives me error textField undeclared 
    // then i try this one 
    NSString *address = text.text; 
    if(iStream != nil) return; 
    [self connect]; 
} 

alors je lance le programme i entrer dans la adresse puis je clique pour connecter le bouton mais il ne fonctionne pas il me donne des erreurs suivantes sur l'écran de sortie

2011-10-03 17:49:14.903 iPhoneClient[360:b303] Text Field contents 64.90.182.55 
2011-10-03 17:49:16.096 iPhoneClient[360:b303] ADDRESS localhost 
2011-10-03 17:49:16.101 iPhoneClient[360:b303] >> : NSStreamEventErrorOccurred 
2011-10-03 17:49:16.102 iPhoneClient[360:b303] << : NSStreamEventErrorOccurred 

ma gestion des événements est comme suit

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent 
{ 
    NSString *io; 
    if (theStream == iStream) io = @">>"; 
    else io = @"<<"; 

    NSString *event; 
    switch (streamEvent) 
    { 
     case NSStreamEventNone: 
      event = @"NSStreamEventNone - Can not connect to the host!"; 
      break; 
     case NSStreamEventOpenCompleted: 
      event = @"NSStreamEventOpenCompleted"; 
      break; 
     case NSStreamEventHasBytesAvailable: 
      event = @"NSStreamEventHasBytesAvailable"; 
      if (theStream == iStream) 
      { 
       //read data 
       uint8_t buffer[1024]; 
       int len; 
       while ([iStream hasBytesAvailable]) 
       { 
        len = [iStream read:buffer maxLength:sizeof(buffer)]; 
        if (len > 0) 
        { 
         NSString *input = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]; 
         if (nil != input) 
         { 
          //do something with data 
          NSLog(@"%@",input); 
         } 
        } 
       } 
      } 
      break; 
     case NSStreamEventHasSpaceAvailable: 
      event = @"NSStreamEventHasSpaceAvailable"; 
      break; 
     case NSStreamEventErrorOccurred: 
      event = @"NSStreamEventErrorOccurred"; 
      break; 
     case NSStreamEventEndEncountered: 
      event = @"NSStreamEventEndEncountered"; 
      [self disconnect]; 
      break; 
     default: 
      event = @"** Unknown"; 
    } 

    NSLog(@"%@ : %@", io, event); 
} 

peut me aider avec mon code? ou me suggère un bon tutoriel que je peux voir des exemples de codes et apprendre plus de choses sur les sockets.

============================================== ============================================= =====

bien depuis que je suis nouveau, il ne peut pas répondre mon propre poste donc je vais le modifier

je pense que je vais aller à bas niveau, oui traiter xml est peu compliquer si Je viens désactivé les parties

//NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    //NSString *address = [defaults stringForKey:@"Address"]; 
    //if(!address) address = @"localhost";] 

et mettre ce code

NSString *address = [text text]; 
    NSLog(@"ADDRESS %@",address); 

maintenant dans mon écran de sortie i get suivantes =

2011-10-03 18:58:57.758 iPhoneClient[424:b303] Text Field contents 64.90.182.55 
2011-10-03 18:58:58.627 iPhoneClient[424:b303] ADDRESS 64.90.182.55 
2011-10-03 18:58:58.685 iPhoneClient[424:b303] >> : NSStreamEventOpenCompleted 
2011-10-03 18:58:58.686 iPhoneClient[424:b303] << : NSStreamEventOpenCompleted 
2011-10-03 18:58:58.686 iPhoneClient[424:b303] << : NSStreamEventHasSpaceAvailable 
2011-10-03 18:58:58.696 iPhoneClient[424:b303] >> : NSStreamEventHasBytesAvailable 
2011-10-03 18:58:58.698 iPhoneClient[424:b303] >> : NSStreamEventEndEncountered 

je pense qu'il dit connecté, mais depuis que je ne fais rien avec des données qu'il est lui-même se termine parce que je mets une boucle d'exécution ci-dessus?

Maintenant, quelqu'un sait comment puis-je récupérer et imprimer la date et l'heure du serveur?

Répondre

1

dans les méthodes:

NSString *address = [text text]; 

lorsque l'onglet utilisateur clé de retour sur le clavier:

-(BOOL)textFieldShouldReturn: (UITextField *)textField { 
    NSLog(@"Text Field contents %@",textField.text); 
    [textField resignFirstResponder]; 
    return YES; 
} 
1

de haut niveau Commentaires:

Je suggère que la communication avec votre serveur en utilisant des flux d'octets est un niveau trop bas. À la place, envisagez d'utiliser JSON ou XML comme format plus gérable.En combinant cela avec une API RESTful, vous pouvez utiliser les requêtes HTTP d'iOS et communiquer avec votre serveur de manière plus productive, portable et gérable.

Espérons que ça aide.

+0

merci pour les conseils, mais je dois apprendre ce type même avec les sockets BSD en C alors que je peux utiliser d'autres moyens pour résoudre mes problèmes mais je pense que j'ai résolu mon premier problème je pense que je peux me connecter au serveur avec la chaîne du champ de texte maintenant, j'ai édité mon poste ci-dessus là –