Существуют ли значительные накладные расходы при использовании HTTP через простые сокеты (Java на Android) для отправки большого (50-200 МБ) файла [файл находится на SD-карте] с устройства Android на сервер Linux по сети Wi-Fi.
В моем текущем прототипе я использую CherryPy-3.2.0 для реализации своего HTTP-сервера. Я использую Android 2.3.3 на Nexus в качестве клиента.
В настоящее время загрузка двоичного файла размером 50 МБ занимает около ~100 секунд** (в более медленной сети 18 Мбит/с*) и ~50 секунд (в более быстрой сети 54 Мбит/с*) в сети Wi-Fi.
ПРИМЕЧАНИЕ.
*Я использую WifiInfo.getLinkSpeed()
для измерения скорости сетевого соединения
** Это разница во времени до и после HTTPClient.execute(postRequest)
Приветствуются любые другие идеи, касающиеся других дорогостоящих операций, которые могут занимать значительную часть общего времени вне сети, и способы сокращения этого времени.
Спасибо.
РЕДАКТИРОВАТЬ - почтовый индекс HTTP на Android
private void doHttpPost(String fileName) throws Exception{
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
int timeoutConnection = 9000000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 9000000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
HttpClient client = new DefaultHttpClient(httpParameters);
client.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109);
HttpPost postRequest = new HttpPost();
postRequest.setURI(new URI("http://192.168.1.107:9999/upload/"));
MultipartEntity multiPartEntity = new MultipartEntity();
multiPartEntity.addPart("myFile", new FileBody(new File(fileName)));
postRequest.setEntity(multiPartEntity);
long before = TrafficStats.getTotalTxBytes();
long start = System.currentTimeMillis();
HttpResponse response = client.execute(postRequest);
long end = System.currentTimeMillis();
long after = TrafficStats.getTotalTxBytes();
Log.d(LOG_TAG, "HTTP Post Execution took " + (end - start) + " ms.");
if( before != TrafficStats.UNSUPPORTED && after != TrafficStats.UNSUPPORTED)
Log.d(LOG_TAG, (after-before) + " bytes transmitted to the server");
else
Log.d(LOG_TAG, "This device doesnot support Network Traffic Stats");
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
responseEntity.consumeContent();
Log.d(LOG_TAG, "HTTP Post Response " + response.getEntity().getContent().toString() );
}
client.getConnectionManager().shutdown();
}
РЕДАКТИРОВАТЬ 2: На основании результатов, представленных этим инструментом, похоже, что скорость чтения SD-карты не является проблемой. Так что это может быть библиотека HttpClient или что-то еще.