Android-соединение с локальным хостом

Я пытаюсь подключить свое приложение для Android к локальному URL-адресу хоста благодаря серверу wamp, но он не работает. Моя цель здесь - получить данные json и проанализировать эти данные. Для моего теста я использую устройство, а не эмулятор, и я использую разрешение в AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

Мой url выглядит так:

String url = "http://10.0.2.2:8080/tests/PhpProject1/connectionBDD.php";

Я попытался:

http://localhost/
http://10.0.2.2:8080/
http://10.0.2.2/

Но он так долго не работал:

    java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 80): connect failed: ECONNREFUSED (Connection refused)

    failed to connect to /10.0.2.2 (port 8080): connect failed: ETIMEDOUT (Connection timed out)

    java.net.ConnectException: failed to connect to /10.0.2.2 (port 80): connect failed: ETIMEDOUT (Connection timed out)

Затем я попытался с помощью теста json url, найденного в Интернете: http://headers.jsontest.com/

Он работал очень хорошо, и я получил данные json по этому адресу. Так что, я думаю, мой код хорош, и проблема здесь в моем localhost url, я не знаю, какая должна быть его точная форма. Я прочитал много потоков об этом, но я не нашел решения.

Здесь мой код:

Основная деятельность:

public class MainActivity extends Activity {
    private String url = "http://10.0.2.2:8080/tests/PhpProject1/connectionBDD.php";

    private ListView lv = null;
    private Button bGetData;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final JsonDownloaderTask task = new JsonDownloaderTask(this);
        lv = (ListView) findViewById(R.id.list);

        bGetData = (Button)findViewById(R.id.getdata);
        bGetData.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {               
                task.execute(url);                      
            }
        });
    }

    public void jsonTaskComplete(JSONArray data){
        //todo
    }   
}

AsyncTask:

public class JsonDownloaderTask extends AsyncTask<String, String, JSONArray> {

    MainActivity ma;

    public JsonDownloaderTask(MainActivity main){
        ma = main;
    }

    @Override
    protected JSONArray doInBackground(String... url) {
        JSONParser jParser = new JSONParser();
        // Getting JSON from URL
        JSONArray jsonArray = null;
        try {
            jsonArray = jParser.getJSONFromUrl(url[0]);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonArray;        
    }

    protected void onPostExecute(JSONArray data){

        ma.jsonTaskComplete(data);
    }
}

JSONParser:

public class JSONParser {
    String data = "";
    JSONArray jsonArray = null;        
    InputStream is = null;

    public JSONParser(){}

    // Method to download json data from url
    public JSONArray getJSONFromUrl(String strUrl) throws IOException{
        try{
            URL url = new URL(strUrl);

            // Creating an http connection to communicate with url
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

            // Connecting to url
            urlConnection.connect();

            // Reading data from url
            is = urlConnection.getInputStream();

            BufferedReader br = new BufferedReader(new InputStreamReader(is));

            StringBuffer sb  = new StringBuffer();

            String line = "";
            while( ( line = br.readLine())  != null){
                sb.append(line);
            }
            is.close();
            data = sb.toString();

            //br.close();

            jsonArray = new JSONArray(data);

        }catch(Exception e){
            Log.d("Exception while downloading url", e.toString());
        }finally{
            is.close();
        }

        return jsonArray;
    }
}

Ответы

Ответ 1

Сначала вам нужно привязать IP-адрес машины, на которой работает ваш сервер, в настройках затмения.

Вы можете сделать это вот так.

Eclipse Run Configuration

Щелкните правой кнопкой мыши по проекту PHP в eclipse, затем запустите конфигурацию, а затем в Web Application, где вы найдете вкладку Argument. Теперь дайте IP-адрес порта и локальной сети вашего компьютера, на котором работает ваш сервер.

Что-то вроде этого --port = 8888 --address = 192.168.1.6, затем обновите URL-адрес до http://192.168.1.6:8080/tests/PhpProject1/connectionBDD.php

Здесь в моем случае это мой IP-адрес LAN 192.168.1.6, там вам нужно будет найти его с помощью сетевой команды типа ipconfig, ifconfig и использовать этот IP-адрес.

Ответ 2

IP-адрес 10.0.2.2 используется для извлечения данных из эмулятора. Localhost всегда указывает на устройство эмулятора/андроида, запускающее приложение. Чтобы ваше устройство извлекало данные с вашего компьютера, оно должно быть в той же сети (подключенной WiFi к вашему маршрутизатору), и вы должны использовать локальный IP-адрес вашего компьютера (обычно 192.168.1.x-номер).

Ответ 3

Если вы попытаетесь подключиться к "localhost", он решит устройство Android, а не ваш собственный локальный хост (если вы не работаете в эмуляторе). Что я рекомендую для разработки, так это добавить меню переполнения в панели действий, в котором есть запись с именем "Настройки" , которая обеспечивает действие "Настройки" для указания параметров приложения и наличие записи "Параметры разработчика" в "Настройки" , которая позволяет указать пользовательский адрес сервера для использования. Во время разработки вы можете использовать эту опцию для ввода пользовательского адреса сервера для своего приложения. (Вам понадобится реальный адрес сервера, который действительно доступен через Интернет, а не использование localhost для этого).

Ответ 4

Я предполагаю, что вы пытаетесь получить доступ к веб-сервису, доступному на вашем ПК, либо с помощью симулятора Android, либо с помощью реального устройства.

Для эмулятора Android вы НЕ должны просто использовать "localhost", потому что "localhost" означает сам эмулятор Android, а не хост-компьютер.

вам нужно изменить файл /etc/hosts или симулятор или реальное устройство. добавьте строку типа "192.168.0.100 service.local".

Ответ 5

если вы используете свой телефон вместо эмулятора и выполняете службы на локальном хосте, а в URL вместо "10.0.2.2" используйте IP-адрес вашего ПК.

Ответ 6

Один простой способ, который я знаю, - хранить мобильные данные и делиться Wi-Fi. Подключите ваш ноутбук или компьютер к этому Wi-Fi. Теперь см. Ip ур ноутбук или рабочий стол. Позвоните по телефону с телефона. Поскольку ваш телефон и компьютер находятся в одной сети сейчас.

Ответ 7

Я попробовал "10.0.2.2:80/mysitename/page.php" Чудо произошло, он работает сейчас. Я нахожусь на Mac и использую XAMPP для сервера.

Вы можете изменить номер порта. до 80 и попробуйте. порт 8080 не работал у меня!

Приветствия.