2011-10-03 85 views
1

在此先感谢那些查看我的问题。我是编程新手,也是Objective-C编程的新手,我正在创建一个简单的客户端,它将连接到日间服务器,并请求将它的时间和日期打印到屏幕上,我已经观看并阅读了大量教程现在,并提出了下面的代码,但我有一个问题,我不能读取用户输入服务器地址的输入,我将使用该服务器地址以连接到服务器这里是我的代码简单的Iphone客户端连接到服务器

我的套接字代码在我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 

我的连接地址和端口

@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]; 
} 

我的默认值

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

我把文本字段我ViewController.m

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

,当按钮点击我把

- (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]; 
} 

然后我运行程序我进入地址然后我点击连接按钮,但它不起作用,它使我在输出屏幕上出现错误

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 

我的事件处理是像下面

- (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); 
} 

任何一个可以帮助我的代码?或者向我建议我是一个很好的教程,我可以看到代码示例并了解有关套接字的更多内容。

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

好吧,因为我是新不允许回答我自己的职位,所以我会编辑

我想我会用低的水平去,是处理XML是有点复杂,从而我只是禁用部分

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

,并把这个代码

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

在我的输出画面我获得以下=

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 

我认为它说,它连接,但因为我什么都不做与数据它将终止本身,因为我把上面运行循环?

现在任何人都知道如何从服务器获取并打印日期和时间?

回答

1
的方法

NSString *address = [text text]; 

时,键盘上的用户选项卡回车键:

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

高层反馈:

我会建议使用字节流服务器通信过低的水平。

相反,请考虑使用JSON或XML作为更易于管理的格式。通过将其与RESTful API结合使用,您可以使用来自iOS的HTTP请求,并以更高效,便携和可管理的方式与您的服务器进行通信。

希望有所帮助。

+0

感谢的建议,但我一定要学这种类型甚至在C BSD插座的话,我可以用其他方式解决我的问题,但我认为我解决了我的第一个问题,我想我可以连接到服务器的字符串从textfield现在,我编辑我的帖子在那里 –