запрос на сервер

Ответить
phenomenon
Сообщения: 22
Зарегистрирован: 17 апр 2013, 17:59

запрос на сервер

Сообщение phenomenon » 24 фев 2014, 17:22

Странная проблема, может это баг андроийда какой-то.
Написал приложение на андройде, которое в частности делает http пост запрос на некий сервер. Время ответа 0.8 - 1 секунда примерно.
Тоже самое приложение на айфоне ,время запроса 0.3-0.4 секунды.
Если делаю запрос через бразузер тоже 0.3-0.4 секунды.

code:

Код: Выделить всё

public void postData() {
    // Create a new HttpClient and Post Header
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php");

    try {
        // Add your data
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("id", "12345"));
        nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);
        
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
    } catch (IOException e) {
        // TODO Auto-generated catch block
    }
} 

читал эту тему http://stackoverflow.com/questions/3046 ... econds-why ниче не помогает

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: запрос на сервер

Сообщение altwin » 25 фев 2014, 11:04

[syntax=java5]
HttpClient httpclient = new DefaultHttpClient();
HttpParams httpParameters = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, WAIT_RESPONSE_TIMEOUT);
HttpConnectionParams.setTcpNoDelay(httpParameters, true);
[/syntax]
TCP_NODELAY
Изображение

phenomenon
Сообщения: 22
Зарегистрирован: 17 апр 2013, 17:59

Re: запрос на сервер

Сообщение phenomenon » 25 фев 2014, 13:56

не помогает.
еще проблема , что https запрос больше берет чем http.

Код: Выделить всё

package com.example.sdktest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
import java.util.Timer;
import java.util.TimerTask;

import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
import android.app.Activity;
import android.content.Context;

public class MainActivity extends Activity{
	Button btn,btn2;
	Timer timer;
	long startTime,endTime,totalTime;
	TextView text;
	StringBuffer log;
	CheckBox chk;
	boolean active = false;
	String url = "my url"; 
	final static int TIMEOUT_MILLISEC = 50000;
	protected PowerManager.WakeLock mWakeLock;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
        this.mWakeLock.acquire();
		setContentView(R.layout.activity_main);
		btn = (Button)findViewById(R.id.button1);
		btn2 = (Button)findViewById(R.id.button2);
		text = (TextView) findViewById(R.id.textView1);
		log = new StringBuffer();
		chk = (CheckBox) findViewById(R.id.checkBox1);
		chk.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
				// TODO Auto-generated method stub
				if (arg1)
					url = //my https url;
				else
					url = //my http url;
				runOnUiThread(new Runnable() {
				    public void run() 
				    {
						log.append("Server: " + url + "\n");
						text.setText(log.toString());

				    }
				});	
			}
		});
		chk.setChecked(true);
		btn2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				if (!active)
				{
					active = true;
					timer = new Timer();
					timer.schedule(new TimerTask() {
						  @Override
						  public void run() {
						    // Your database code here
							  serverRequest();
						  }
						},0, 2*1000);
				}
			}
		});
		btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				if (active) 
					timer.cancel();
				active = false;
			}
		});
			
	}

	public void serverRequest()
	{
		Log.e("mylog", "serverRequest");
		runOnUiThread(new Runnable() {
		    public void run() 
		    {
				log.append("serverRequest \n");
				text.setText(log.toString());
				new CheckSetting().execute(url);

		    }
		});	
	}
	public static HttpClient getNewHttpClient() {
	    try {
	        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
	        trustStore.load(null, null);

	        SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
	        //SSLSocketFactory sf = SSLSocketFactory.getSocketFactory();
	        
	        
	        
	        sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

	        HttpParams params = new BasicHttpParams();
	        //time out
	        HttpConnectionParams.setConnectionTimeout(params,
	        		TIMEOUT_MILLISEC);
	        HttpConnectionParams.setSoTimeout(params, TIMEOUT_MILLISEC);
	        HttpConnectionParams.setTcpNoDelay(params, true);
	        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
	        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
	        
	        SchemeRegistry registry = new SchemeRegistry();
	        
	        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
	        registry.register(new Scheme("https", sf, 443));

	        ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

	        return new DefaultHttpClient(ccm, params);
	    } catch (Exception e) {
	        return new DefaultHttpClient();
	    }
	}
	protected class CheckSetting extends AsyncTask<String, Void, String> {
		@Override
		protected String doInBackground(String... urls) {
			String response = "";
			for (String url : urls) {
				HttpClient client = getNewHttpClient();
				try {

					HttpGet httpGet = new HttpGet(url);
					startTime = System.currentTimeMillis();
					HttpResponse execute = client.execute(httpGet);
					InputStream content = execute.getEntity().getContent();

					BufferedReader buffer = new BufferedReader(
							new InputStreamReader(content));
					String s = "";
					while ((s = buffer.readLine()) != null) {
						response += s;
					}

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			return response;
		}

		@Override
		protected
		// this call back if after checking from server
		void onPostExecute(String result) {
			endTime   = System.currentTimeMillis();
			totalTime = endTime - startTime;
			runOnUiThread(new Runnable() {
			    public void run() 
			    {
					log.append("get Json from server. request take " + String.valueOf(totalTime) + "msec \n");
					text.setText(log.toString());

			    }
			});	
			Log.e("mylog", "get Json from server. request take " + String.valueOf(totalTime) + "msec");
		}
	}
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.e("mylog","stop");
		timer.cancel();
	}

}
картинка запроса.
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: запрос на сервер

Сообщение altwin » 25 фев 2014, 16:18

Вместо String s = ""; в методе CheckSetting это: StringBuilder s = new StringBuilder();
Итого вместе с циклом:
[syntax=java5]
String response = null;
String line = null;
StringBuilder s = new StringBuilder();
while ((line = reader.readLine()) != null)
{
s.append(line + "\n");
}
response = s.toString();
[/syntax]
&nbspПеременные s и response из вашего кода, line новая, замените и все.

P.S. другие части не имеющие отношение непосредственно к запросу я не смотрел, но вообще используйте лучше это: https://github.com/mcxiaoke/android-volley или это: http://loopj.com/android-async-http/
Изображение

phenomenon
Сообщения: 22
Зарегистрирован: 17 апр 2013, 17:59

Re: запрос на сервер

Сообщение phenomenon » 25 фев 2014, 16:39

попробую спасибо

Ответить