문제

5 초마다 서버와 비동기로 연결합니다. URL은 동일하지만 사후 신체는 매번 변경됩니다. 이제 나는 매번 스크래치에서 nsurl, nsurlrequest 및 nsurlconnection을 만듭니다.

연결을 한 번 설정하고 더 사용하는 것이 더 효과적이라고 생각합니다. 나는 초보자이며 가능한지 확실하지 않습니다. 변이 가능한 nsurlconnection은 없지만 다음과 같은 nsurlconnection을 만들어야 할 수도 있습니다.

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

NSMutableUrlRequest Post-Data를 변경하여 서버에 다른 요청을 보냅니다. 어느 방향이 맞습니까?

도움이 되었습니까?

해결책

나는 당신이 염려하는 것이 HTTP 연결을 만드는 오버 헤드라고 가정합니다. NSURLConnection은 HTTP/1.1을 사용하고 기존 연결을 재사용 할 수있을 정도로 똑똑합니다. 지난번에 확인한 파이프 라인을 사용하지는 않지만 귀하의 목적을 위해 연결 재사용으로 충분해야합니다. 네트워크 스나이퍼를 넣고 원하는대로 작동하는지 확인하는 것이 좋습니다.

객체 자체를 만드는 데 드는 비용은 5 초당 한 번의 순서대로 사소한 일이며 그것을 최적화하려고 시도해서는 안됩니다 (물론 NSURL을 재사용해야합니다). 특히 iPhone에서 비싸지 않은 서버에 대한 연결을 여는 것입니다.

당신이 정말로 파이프 라인이 필요하다는 것을 알게되면, 불행히도 당신은 자신의 것을 굴려야합니다. 나는 cfhttpstream이 그것을 할 수 있다고 들었지만, 그 증거는 많이 보이지 않습니다. CocoaasyncSocket은 저수준 코드를 작성하지 않고도 소켓에 대한 저수준 액세스에 가장 적합한 방법입니다.

셀 네트워크의 대기 시간은 매우 나빠질 수 있으므로 연결을 완료하는 데 5 초 이상이 걸릴 수 있습니다. 다음을 시작하기 전에 하나의 연결이 수행되거나 점점 더 열린 연결을 시작하십시오.

다른 팁

사물을 명확히하기 위해 NsurlConnection은 기존 소켓을 재사용하지만 비교적 작은 시간 프레임 (12 초)에 대해서만 재사용합니다. 요청을 보내면 응답을 되 찾아서 12 초 이내에 후속 요청을 보내서 두 번째 요청이 동일한 소켓에서 나옵니다. 그렇지 않으면 소켓은 클라이언트가 닫힙니다. 이 타이머를 늘리거나 구성 가능하게하기 위해 Apple에 버그가 제출되었습니다.

@Rob Napier @eric Nelson 귀하가 언급했듯이 : "NSURLConnection은 HTTP/1.1을 사용하고 기존 연결을 재사용하는 데 도움이 될 정도로 똑똑합니다." 그러나 Apple의 문서에서는 그러한 설명을 찾을 수 없습니다.

명확하게하기 위해 테스트 할 코드를 작성합니다.

- (IBAction)onClickSend:(id)sender {
    [self sendOneRequest];
}

-(void)sendOneRequest {

    NSURL *url = [NSURL URLWithString:@"http://192.168.1.100:1234"];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request addValue:[Base64 encodeFromString:kValueVersion] forHTTPHeaderField:kKeyVersion];
    [request addValue:[Base64 encodeFromString:kValueDataTypeCmd] forHTTPHeaderField:kKeyDataType];
    [request addValue:[Base64 encodeFromString:@"Test"] forHTTPHeaderField:kKeyCmdName];
    [request addValue:[Base64 encodeFromString:@"Test"] forHTTPHeaderField:kKeyDeviceName];
    [request addValue:[Base64 encodeFromString:@"xxdafadfadfa"] forHTTPHeaderField:kKeyDTLCookies];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [connection start];
}

그런 다음 "(tcp.flags.syn == 1) || (tcp.flags == 0x0010 && tcp.sq == && tcp .ack == 1) "TCP 3 방향 핸드 쉐이크를 필터링합니다. 불행히도, 나는 "SendoneRequest"라는 각 호출에 대해 3 방향 핸드 쉐이크를 볼 수 있습니다. 즉, nsurlconnection은 기존 연결을 재사용하지 않는 것 같습니다. 내 코드에서 무엇이 잘못되었는지, NSURLConnection을 통해 하나의 소켓 연결을 통해 여러 요청을 보내는 방법에 대해 한 가지를 지적 할 수 있습니까?

또한 요청을 보내는 동기식 방법을 시도했습니다.

-(void)sendOneRequest {
    NSURL *url = [NSURL URLWithString:@"http://192.168.1.100:1234"];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request addValue:[Base64 encodeFromString:kValueVersion] forHTTPHeaderField:kKeyVersion];
    [request addValue:[Base64 encodeFromString:kValueDataTypeCmd] forHTTPHeaderField:kKeyDataType];
    [request addValue:[Base64 encodeFromString:@"Test"] forHTTPHeaderField:kKeyCmdName];
    [request addValue:[Base64 encodeFromString:@"Test"] forHTTPHeaderField:kKeyDeviceName];
    [request addValue:[Base64 encodeFromString:@"xxdafadfadfa"] forHTTPHeaderField:kKeyDTLCookies];

    [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    sleep(1);

    [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    sleep(1);

    [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

}

그리고 결과는 동일합니다.

======= 업데이트 ==========================

마지막으로, 내 테스트가 Rob 및 Eric Say와 다른 이유를 발견했습니다. 요컨대, Rob과 Eric이 맞습니다. NSURLConnection은 HTTP/1.1을 사용하기위한 "Keep-Alive"를 기본값으로 사용하고 기존 소켓 연결을 재사용하지만 비교적 작은 시간 프레임 만 사용합니다.

그러나 NSURLConnection에는 "청크 전송 코딩"(예 : 콘텐츠 길이가없는)에 문제가 있습니다.

내 테스트에서 서버 측은 컨텐츠 길이 및 응답 데이터없이 응답을 보내며, 대응이 크고 NsurlConnection이 연결을 닫으므로 각 HTTP 게시물에 대해 3 방향 핸드 쉐이크가 발생합니다.

서버 코드를 변경하고 응답 길이를 0으로 설정하면 동작이 정확합니다.

요청을 반환하고 수행하는 방법을 만드십시오

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:[self requestMethod] delegate:self];

?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top