2011-10-03 88 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現在,我編輯我的帖子在那裏 –