이제 방금 HTTP를 사용하기 시작했습니다. GET 및 POST 사용하여 간단한 HTTP requsts 타이밍되었습니다. 내가 사용한 웹 페이지는 올바른 $ _GET []와 $ _POST []에 대한 3 행 PHP 검사로 문자 "1"을 반향시킵니다. POST와 GET을 사용하여 동일한 단 하나의 짧은 이름/값 쌍을 사용하여 패킷 단편화가 필요 없도록하고 모든 것이 UI 스레드의 스레드에서 수행됩니다. 요청은 전화를 걸는 동안 여러 번 반복됩니다. 모든 것이 잘 작동합니다. (아래 코드를 참조하십시오) 즉, "1"응답을 반환합니다. 그러나 지속적인 타이밍 문제가 있습니다. 더 이상 GET 및 POST 방법 모두에서 후속 할려고보다 첫 번째 시도에서첫 번째 HTTP POST 및 GET 시도는 항상 느립니다. -이 OS와 네트워크 또는 네트워크입니까?
요청을 할 수있는 시간 : 은 내가 관찰하는 것입니다.
나머지 시도는 항상 둘 다 훨씬 빠릅니다.
GET은 항상 POST보다 빠릅니다.
이러한 모든 사항은 3G 및 Wi-Fi 연결에 적용됩니다 (Wi-Fi는 예상보다 훨씬 빠름).
나는 이것을 BasicResponseHandler()와 더 많은 수동 Buffered IO Stream 메소드와 같은 결과로 시도했다.
나는 POST가 두 개의 전송을 필요로한다는 결과를 얻었습니다. 하나는 'HTTP 100'을 반환하고 그 다음 패킷 본문을 반환합니다. - 이 올바른지?
내 기본 질문은 너무 느린 첫 번째 요청 시도에서 무엇이 일어나고있는 것입니까? 때때로 그것은 몇 초 (!) 걸립니다. 그것이 일종의 대기열을 만드는 소켓에 물건을 들고 있거나 안드로이드를 넣고있는 네트워크입니까? 안드로이드라면 더 적절하게 코딩하고 피하는 방법이 있을까요? 실행 중에 한 번만이 문제가 발생하도록 소켓을 열어 두는 것에 대해 뭔가가 있습니까? 그렇다면 그렇게하는 것이 좋은 습관입니까? 틀림없이,이 apsect는 내가 가장 단서가 없다.
나는이 문제에 대해 토론을했지만,이 부분을 직접적으로 언급하지는 않았다.
-
의 기본 코드를 모두 GET과 POST 방법 (마이너스 시도/캐치)과 같다, 먼저 GET 방법을, UI를 벗어난 스레드에서 다음 POST 방법을 수행 : (아래에 출력) 그것의
GET 부분 :
public String[] HTTPGETIt(int numrounds)
{
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter (CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);
HttpGet GETRequest = new HttpGet("http://mypage.com/epoch.php?mynameis=tam");
ResponseHandler <String> MyBRH = new BasicResponseHandler();
String[] GETResult = new String[numrounds];
int i = 0;
long timestart, DT;
while(i < numrounds)
{
timestart = System.currentTimeMillis();
GETResult[i] = httpclient.execute(GETRequest, MyBRH);
DT = System.currentTimeMillis() - timestart;
Log.d(TAG, "(" + i + ") GET-Round Trip was "+ DT + " ms.");
i++;
}//while i <= numrounds
httpclient.getConnectionManager().shutdown();
return GETResult;
} //END HTTPGETIt
그리고 POST 버전 :
public String[] HTTPPOSTIt(int numrounds)
{
String Place = "HTTPPostping";
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);
HttpPost PostRequest = new HttpPost("http://mypage.com/epoch.php");
ResponseHandler <String> MyBRH = new BasicResponseHandler();
String[] POSTResult = new String[numrounds];
List<NameValuePair> MynameValuePairs = new ArrayList<NameValuePair>(2);
MynameValuePairs.add(new BasicNameValuePair("mynameis", "tam"));
PostRequest.setEntity(new UrlEncodedFormEntity(MynameValuePairs));
int i = 0;
long timestart, DT;
while(i < numrounds)
{
timestart = System.currentTimeMillis();
POSTResult[i] = httpclient.execute(PostRequest, MyBRH);
DT = System.currentTimeMillis() - timestart;
Log.d(TAG, "(" + i + ") POST-Round Trip was "+ DT + " ms.");
i++;
}//while i <= numrounds
httpclient.getConnectionManager().shutdown();
return POSTResult;
} // END HTTPPOSTIt
보다 Runnable으로
Runnable HTTPPOSTJob = new HTTPPOSTTask(NS);
Thread HTTPPOSTThread = new Thread(HTTPPOSTJob, "HTTPPOSTThread");
HTTPPOSTThread.setPriority(Thread.MAX_PRIORITY);
HTTPPOSTThread.start();
:
Runnable HTTPGETJob = new HTTPGETTask(NS);
Thread HTTPGETThread = new Thread(HTTPGETJob, "HTTPGETThread");
HTTPGETThread.setPriority(Thread.MAX_PRIORITY);
HTTPGETThread.start();
하고 :
이들은 의해 호출
class HTTPGETTask implements Runnable
{
int numtimes;
DeviceInfo tsrtDI;
HTTPGETTask(int inNS) {
this.numtimes = inNS;
}
@Override
public void run()
{
long [] TT2NS = new long[numtimes];
TT2NS = HTTPGETIt(numtimes);
}
};
및
class HTTPPOSTTask implements Runnable
{
int numtimes;
DeviceInfo tsrtDI;
HTTPPOSTTask(int inNS) {
this.numtimes = inNS;
}
@Override
public void run()
{
long [] TT2NS = new long[numtimes];
TT2NS = HTTPPOSTIt(numtimes);
}
};
를 출력 일반적이다
,617,(0) GET 왕복 시간은 368ms입니다.
(1) GET 왕복 이동은 103ms입니다.
(2) GET 왕복 이동은 98ms입니다.
(3) GET 왕복 이동은 106ms입니다.
(4) GET 왕복 시간은 102ms입니다.
(0) POST-왕복은 1,289 밀리이었다.
(1) POST-Round Trip은 567ms입니다.
(2) POST-Round Trip은 589ms입니다.
(3) POST-Round Trip은 496ms입니다.
(4) POST-Round Trip은 557ms입니다.
첫 번째 요청 결과가 캐시 된 후 –
이 dns 해상도 일 수 있습니까? IP 주소를 시도하십시오 – goat
@rambo 그냥 동일한 결과와 함께 명시 적 IP 주소를 시도. – Tam