在iPad上,我使用NSURLRequest来轮询我的WLAN上的http服务器上的文件。我每秒都会读一次这个文件。我使用以下代码来读取文件。
NSURLRequest *request = [NSURLRequest requestWithURL:myURL
cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:30.0];
// Get the data
NSURLResponse *response;
NSError *dataError;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&dataError ];
在服务器上运行netstat会显示以下网络活动(其中10.0.1.11是正在轮询服务器的iPad的IP地址:
Proto Local Address Foreign Address State
TCP 10.0.1.16:80 10.0.1.11:56999 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57010 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57011 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57012 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57013 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57014 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57015 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57016 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57017 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57018 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57019 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57020 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57021 TIME_WAIT
TCP 10.0.1.16:80 10.0.1.11:57022 ESTABLISHED
我是否应该担心iPad端有多个端口?在阅读之后我应该以某种方式“关闭”NSURLConnection吗?我正在使用ARC。
答案 0 :(得分:1)
当你关闭一个端口时,它会进入TIME_WAIT
一段时间,以确保不会再从另一端显示流量。它可以在几秒到几分钟内处于该状态,具体取决于实现。
它最终会成功,但是你会以这种方式在服务器和客户端上投入大量的开销。如果很多客户这样做,you can definitely overwhelm the server.
您不应每秒轮询使用新连接的服务器。您应该保持打开一个连接并在其上侦听来自服务器的新消息(这通常称为“长轮询”)。或者您可以重用与HTTP / 1.1的连接。在任何情况下,如果您深入了解网络,您几乎总是希望从NSURLConnection
切换到AFNetworking,这样可以更好地支持管理这些类型的连接。
答案 1 :(得分:0)
实际上NSURLConnection
将在请求结束后关闭。
你是在另一个线程中发送这些请求吗?
如果是,我相信你在netstat中看到的是与服务器的开放连接。似乎每个请求都需要更长的时间,所以第二个和第三个和第四个连接正在建立(等等)。