@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.seq==1 && tcp 启动 Wireshark 以捕获服务器 (192.168.1.xxx) 上的包.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 所说的不同的原因。简而言之,Rob 和 Eric 是正确的。并且 NSURLConnection 使用“keep-alive”作为使用 HTTP/1.1 的默认值,并重用现有的套接字连接,但仅适用于相对较短的时间范围。
然而,NSURLConnection 对于“分块传输编码”(即没有内容长度)存在一些问题。
在我的测试中,服务器端发送一个没有内容长度和响应数据的响应,它是分块响应,NSURLConnection 将关闭连接,因此每个 http 帖子都会发生 3 次握手。
我更改了我的服务器代码,将响应长度设置为 0,并且行为正确。