Android连接到localhost

时间:2014-02-16 13:31:30

标签: java android json localhost wamp

我正在尝试将我的Android应用程序连接到本地主机URL,这要归功于wamp服务器,但它不起作用。我的目标是获取json数据并解析这些数据。对于我的测试,我使用的设备不是模拟器,我在AndroidManifest.xml中使用权限:

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

我的网址看起来像这样:

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网址,我不知道应该是什么样的确切形式.. 我读了很多关于它的线索,但我找不到解决方案。

这是我的代码:

主要活动:

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;
    }
}

9 个答案:

答案 0 :(得分:11)

IP地址10.0.2.2用于从仿真器获取数据。 Localhost将始终指向运行该应用程序的模拟器/ android设备。 要让您的设备从您的电脑上获取数据,它应该在同一个网络中(通过WiFi连接到您的路由器),您应该使用您的电脑的本地IP地址(通常是192.168.1.x号码)。 / p>

答案 1 :(得分:5)

如果您尝试连接到“localhost”,它将解析为Android设备,而不是您自己的localhost(除非您在模拟器中运行)。我建议开发的是在操作栏中添加一个溢出菜单,其中包含一个名为“Settings”的条目,该条目提供用于指定应用程序设置的Settings活动,并在“Settings”中有一个“Developer options”条目,可让您指定要使用的自定义服务器地址。在开发期间,您可以使用此选项为您的应用输入自定义服务器地址。 (您将需要一个实际的服务器地址,实际上可以通过Internet访问,而不是使用localhost)。

答案 2 :(得分:3)

首先,您必须在eclipse设置中绑定运行服务器的计算机的IP地址。

你可以这样做。

Eclipse Run Configuration

右键单击eclipse中的PHP项目,然后单击Run Configuration,然后在Web Application中找到Argument选项卡。现在,在此处提供运行服务器的计算机的端口和LAN IP地址。

像这样 - port = 8888 --address = 192.168.1.6 然后将网址更新为http://192.168.1.6:8080/tests/PhpProject1/connectionBDD.php

在我的情况下,这是我的局域网IP地址192.168.1.6,您必须使用ipconfigifconfig之类的网络命令找到它并使用该IP地址。

答案 3 :(得分:3)

如果您使用手机而不是模拟器并在localhost上运行服务,则使用网址而不是&#39; 10.0.2.2&#39;使用PC的IP地址。

答案 4 :(得分:0)

我知道的一个简单方法是保持移动数据并共享wifi。将笔记本电脑或计算机连接到此wifi。现在看看你的笔记本电脑或台式机的IP。从您的手机拨打电话服务。由于您的手机和计算机现在处于同一网络中。

答案 5 :(得分:0)

我假设您正尝试从Android模拟器或真实设备访问PC上可用的Web服务。

对于Android模拟器,您必须 NOT 只使用“localhost”,因为“localhost”表示Android模拟器本身, NOT 主机PC。

您需要修改/ etc / hosts文件或模拟器或真实设备。添加像“192.168.0.100 service.local”这样的行。

答案 6 :(得分:0)

我尝试了 &#34; 10.0.2.2:80 / mysitename / page.php&#34; 奇迹发生了,它现在正在工作。 我在Mac上并使用XAMPP作为服务器。

您可以更改端口号。到80并尝试。 8080端口对我不起作用!

干杯。

答案 7 :(得分:0)

只需在Visual Studio中安装“ Keyoti输送机”扩展名,它就会根据您的IP地址自动生成一个url。这是链接:

conveyor

到目前为止一切都很好...!

答案 8 :(得分:0)

我通过以下方法解决了它: 1.在清单中添加另一个android权限:“ android.permission.ACCESS_NETWORK_STATE” 2.在使用xampp时,我已经共享了网络中桌面的xampp文件夹。 3. xampp在IP为192.168.x.x的桌面上运行,因此Web服务的URL而不是良性的{http://localhost/myapi ...“是” http://192.168.x.x/myapi ...“

我使用仿真器以及在设备中测试了该应用程序。两种情况都能解决。