2012-06-13 2 views
6

이제 방금 HTTP를 사용하기 시작했습니다. GET 및 POST 사용하여 간단한 HTTP requsts 타이밍되었습니다. 내가 사용한 웹 페이지는 올바른 $ _GET []와 $ _POST []에 대한 3 행 PHP 검사로 문자 "1"을 반향시킵니다. POST와 GET을 사용하여 동일한 단 하나의 짧은 이름/값 쌍을 사용하여 패킷 단편화가 필요 없도록하고 모든 것이 UI 스레드의 스레드에서 수행됩니다. 요청은 전화를 걸는 동안 여러 번 반복됩니다. 모든 것이 잘 작동합니다. (아래 코드를 참조하십시오) 즉, "1"응답을 반환합니다. 그러나 지속적인 타이밍 문제가 있습니다. 더 이상 GET 및 POST 방법 모두에서 후속 할려고보다 첫 번째 시도에서첫 번째 HTTP POST 및 GET 시도는 항상 느립니다. -이 OS와 네트워크 또는 네트워크입니까?

  1. 요청을 할 수있는 시간 : 은 내가 관찰하는 것입니다.

  2. 나머지 시도는 항상 둘 다 훨씬 빠릅니다.

  3. 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입니다.

+0

첫 번째 요청 결과가 캐시 된 후 –

+0

이 dns 해상도 일 수 있습니까? IP 주소를 시도하십시오 – goat

+0

@rambo 그냥 동일한 결과와 함께 명시 적 IP 주소를 시도. – Tam

답변

1

Protocol VersionHTTP 1.1으로 설정하고 시도해 보시기 바랍니다. 요청/응답 시간이 지금보다 오래 걸립니다. 나는 그것을 시도하지 않았다, 다만 정보가있다. 따라서 요청을 실행하기 전에 아래와 같이 시도 할 수 있습니다. 이 HTTP 1.1 연결을 유지하고 때마다 손을 흔들 해달라고 때문인 것으로 보인다 빠른 통화를하는 데 도움이 될 수 있습니다 내가 더 그랜드 Poptani의 대답에 동의

httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, 
                 HttpVersion.HTTP_1_1); 
+0

방금 ​​시도했는데, 변하지 않아. 나는 또한 그것을 포함하기 위해 게시 된 코드를 업데이트하여 완성도를 위해 작성했습니다. 생각해 줘서 고마워. – Tam

1

.

그러나 동시에 나는 이것이 Android 관련 문제가 아니라고 말하고 싶습니다.이 동일한 작업은 거의 모든 플랫폼과 각 언어에서 발생합니다. 처음으로 플랫폼에서 http 호출을 할 때 만들어야하기 때문입니다 다른 객체를 설정하여 호출을 수행하기 위해 값을 지정하고 그 값을 지정하면 새 호출을 할 때 객체를 만들고 할당하는 시간이 절약되므로보다 빠른 응답을 얻을 수 있습니다.

이러한 개체는 무엇입니까? - 그건 위의 라인에있다 : 나는 그들 중 꽤 명확한 목록이 없지만 프록시 설정, 캐시 메모리와 같다.


누군가가 이에 대한 심층적 인 기술적 지식을 제공하고 모든 내용이 어떻게 작동하는지 설명 할 때까지 몇 가지 더 기다려주십시오.

+0

감사합니다. 나는 내가 함께 일한 다른 OS에서 이런 유형의 프로그래밍을하지 않았다. – Tam