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?
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à –