简单的Iphone客户端到服务器的连接

简单的Iphone客户端到服务器的连接,iphone,objective-c,sockets,nsstring,nsstream,Iphone,Objective C,Sockets,Nsstring,Nsstream,提前感谢那些看到我的问题的人。我不熟悉编程,也不熟悉Objective-c编程,我正在创建一个简单的客户端,它将连接到日间服务器,请求时间和日期,然后将其打印到屏幕上,我现在已经观看并阅读了很多教程,并提出了以下代码,但我有一个问题,我无法读取用户输入的输入,该用户将输入服务器地址,我将使用该服务器地址连接到服务器。这是我的代码 我的控制器.m文件中的套接字代码 @interface NSStream (MyAdditions) + (void)getStreamsToHostNamed:(N

提前感谢那些看到我的问题的人。我不熟悉编程,也不熟悉Objective-c编程,我正在创建一个简单的客户端,它将连接到日间服务器,请求时间和日期,然后将其打印到屏幕上,我现在已经观看并阅读了很多教程,并提出了以下代码,但我有一个问题,我无法读取用户输入的输入,该用户将输入服务器地址,我将使用该服务器地址连接到服务器。这是我的代码

我的控制器.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
我的默认值是

<?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>
当按钮点击时,我把

- (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
然后把这个密码

    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
2011-10-03 18:58:57.758 iPhone客户端[424:b303]文本字段内容64.90.182.55
2011-10-03 18:58:58.627 iPhone客户端[424:b303]地址64.90.182.55
2011-10-03 18:58:58.685 iPhone客户端[424:b303]>>:NSStreamEventTopEnCompleted
2011-10-03 18:58:58.686 iPhone客户端[424:b303]:NSStreamEventHasBytesAvailable
2011-10-03 18:58:58.698 iPhoneClient[424:b303]>>:NS2已停止
我想它说它已连接,但由于我对数据不做任何处理,它正在终止自己,因为我在上面放了一个运行循环

现在有人知道如何从服务器获取和打印日期和时间了吗

高层反馈:

我建议使用字节流与服务器通信的级别太低

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

希望对您有所帮助。

方法:

NSString *address = [text text];
当用户选项卡返回键盘上的键时:

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

谢谢你的建议,但我必须学习这种类型,即使是C语言中的BSD套接字,我也可以用其他方法来解决我的问题,但我想我解决了我的第一个问题,我想我现在可以用textfield中的字符串连接到服务器了,我在上面编辑了我的文章
    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
NSString *address = [text text];
-(BOOL)textFieldShouldReturn: (UITextField *)textField {
    NSLog(@"Text Field contents %@",textField.text);
    [textField resignFirstResponder];
    return YES;
}