2011-06-16 19 views
-1

「http://」と入力せずにサーバーに接続する必要があります。ユーザーからサーバー名とポート番号だけを取得する必要があります。目的のCでHTTPリクエストを送信

生産コードで
- (void)loadHostName:(NSString *)hostName onPort:(NSInteger)portNumber { 

    responseData = [[NSMutableData alloc] init]; 
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%i", hostName, portNumber]]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    [connection release]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [responseData setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [responseData appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    NSLog(@"Oh noes! %@", [error localizedDescription]); 
    [responseData release]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

    // Do something with the data, like load it in a web view. 
    [webView loadData:responseData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil]; 
    [responseData release]; 
} 

、あなたはキャッシュ要求、認証チャレンジを処理する必要があります:これで、私はその最も単純な形では

答えて

5

...特定のサーバに接続できるようになり、それは次のようになります(NSURLConnectionのメッセージを参照してください)、上記の例ではHTTPリクエストを送信してWebビューにロードします。

+0

@Richardあなたがして完了したらnilにごアイバーズを設定しますそれらはいつも良いことですが、その例題をその質問に集中させておくために、私はそれをやめました。オートリリースすることは無意味です。 –

+0

'responseData'変数は、要求の結果に応じて' connectionDidFinishLoading: 'または' connection:didFailWithError: 'のいずれかで最後にアクセスされます。これ以上のNSURLConnectionコールバックは存在しないので、何も変数に再度アクセスすることはありません。また、それをnilに設定しても何も得られません。それをオートレースするのと同じことです。これは、自動解放プールが、今すぐ実行するのではなく、後で解放することを意味します。どちらの場合も、変数の設定が完了しているので、メモリ管理を可能な限り緊密に保つことができます。 'dealloc'でも解放しないでください。 –

+0

あなたは私が話しているケースに対処していません。これは生産的ではありません。削除する。 – Richard

1

これを試してみて、

NSURL *aUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%i", hostName, portNumber]]; 
NSURLRequest *request = [NSURLRequest requestWithURL:aUrl 
             cachePolicy:NSURLRequestUseProtocolCachePolicy 
            timeoutInterval:60.0]; 


    NSURLResponse *resp = nil; 
    NSError *err = nil; 
    NSData *response = [NSURLConnection sendSynchronousRequest: theRequest    returningResponse: &resp error: &err]; 
NSString * theString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 
[resp release]; 
[err release]; 
NSLog(@"response: %@", theString); 
+0

同期要求が悪い理由は次のとおりです。 1.実行ループをブロックするため、メインスレッドで呼び出された場合、応答待ちの間UIがロックされます。 2.同期要求をキャンセルすることはできません。 3.認証の問題に応答することはできません。 4. SSL証明書のエラーは検証できません。 5. ... コードが少なくても、同期要求は使用しないでください。 –

0

だけでなく、あなたはHTTPをハードコーディングすることができます。サーバー名

例で//

NSString *serverName = "stackoverflow.com"; 
NSNumber *portNumber = 10; 
NSString *finalYrl = [NSString StringWithFormat:@"HTTP://%@:%@",serverName , portNumber]; 
関連する問題