简体   繁体   中英

Android Web Service connection refused

I know that my code is correct because it worked once. There is no problem with my PHP because when it runs, it returns what I want. The problem here is in the request. I am trying to get the correct address but so far I've tried every possible one and had no success. My code is:

package com.example.testwiththread;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
    JSONParser jsonParser = new JSONParser();
    String pid;
    String name = "";
    String test = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.service_details);
        new Thread(new TestThread()).start();
        Toast.makeText(this, "Hi", Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public void clickSend (View view) {

        EditText txtName = (EditText) findViewById(R.id.txtName);
        EditText txtPrice = (EditText) findViewById(R.id.txtTest);

        // display product data in EditText
        txtName.setText(name);
        txtPrice.setText(test);
        Log.e("Checking", name);
        Log.e("Checking", test);
    }

    public class TestThread extends Thread {
        public void run() {
            int success;
            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("pid", pid));

                // getting product details by making HTTP request
                // Note that product details url will use GET request
                JSONObject json = jsonParser.makeHttpRequest(
                        "http://10.0.2.2:8080/webservice.php", "GET", params);

                // check your log for json response
                Log.d("Single Record Details", json.toString());

                // json success tag
                success = json.getInt("success");
                if (success == 1) {
                    // successfully received product details
                    JSONArray productObj = json.getJSONArray("record"); // JSON Array

                    // get first product object from JSON Array
                    JSONObject product = productObj.getJSONObject(1);

                    name = product.getString("name");
                    test = product.getString("test");
                }
            } catch (JSONException e) {
                Log.e("error", e.toString());
            }
        }
    }
}

My JSON Parser:

package com.example.secondtestsqlserver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    // function get json from url
    // by making HTTP POST or GET method
    public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {

        // Making HTTP request
        try {

            // check for request method
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }else if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }           

        } catch (UnsupportedEncodingException e) {
            Log.e("Unsupported Encoding", Log.getStackTraceString(e));
        } catch (ClientProtocolException e) {
            Log.e("Client Protocol", Log.getStackTraceString(e));
        } catch (IOException e) {
            Log.e("IO Exception", Log.getStackTraceString(e));
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
            System.out.println(e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
            Log.e("JSON Parser", json);
        }

        // return JSON String
        return jObj;

    }
}

As you can see I am using 10.0.2.2:8080 as the localhost address. I have tried 127.0.0.1, localhost, and many other options included in the Android page for localhost. Most of them return this error

02-11 15:18:31.329: E/IO Exception(27504): org.apache.http.conn.HttpHostConnectException: Connection to http://10.0.2.2:8080 refused
02-11 15:18:31.329: E/IO Exception(27504):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:183)
02-11 15:18:31.329: E/IO Exception(27504):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
02-11 15:18:31.329: E/IO Exception(27504):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
02-11 15:18:31.329: E/IO Exception(27504):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
02-11 15:18:31.329: E/IO Exception(27504):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
02-11 15:18:31.329: E/IO Exception(27504):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
02-11 15:18:31.329: E/IO Exception(27504):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
02-11 15:18:31.329: E/IO Exception(27504):  at com.example.testwiththread.JSONParser.makeHttpRequest(JSONParser.java:62)
02-11 15:18:31.329: E/IO Exception(27504):  at com.example.testwiththread.MainActivity$TestThread.run(MainActivity.java:63)
02-11 15:18:31.329: E/IO Exception(27504):  at java.lang.Thread.run(Thread.java:856)
02-11 15:18:31.329: E/IO Exception(27504): Caused by: java.net.ConnectException: failed to connect to /10.0.2.2 (port 8080): connect failed: ETIMEDOUT (Connection timed out)
02-11 15:18:31.329: E/IO Exception(27504):  at libcore.io.IoBridge.connect(IoBridge.java:114)
02-11 15:18:31.329: E/IO Exception(27504):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
02-11 15:18:31.329: E/IO Exception(27504):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
02-11 15:18:31.329: E/IO Exception(27504):  at java.net.Socket.connect(Socket.java:842)
02-11 15:18:31.329: E/IO Exception(27504):  at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
02-11 15:18:31.329: E/IO Exception(27504):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
02-11 15:18:31.329: E/IO Exception(27504):  ... 9 more
02-11 15:18:31.329: E/IO Exception(27504): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
02-11 15:18:31.329: E/IO Exception(27504):  at libcore.io.Posix.connect(Native Method)
02-11 15:18:31.329: E/IO Exception(27504):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
02-11 15:18:31.329: E/IO Exception(27504):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
02-11 15:18:31.329: E/IO Exception(27504):  at libcore.io.IoBridge.connect(IoBridge.java:112)
02-11 15:18:31.329: E/IO Exception(27504):  ... 14 more
02-11 15:18:31.329: E/Buffer Error(27504): Error converting result java.lang.NullPointerException: lock == null
02-11 15:18:31.329: E/JSON Parser(27504): Error parsing data org.json.JSONException: End of input at character 0 of 
02-11 15:18:31.329: W/dalvikvm(27504): threadid=11: thread exiting with uncaught exception (group=0x40e46930)
02-11 15:18:31.329: E/AndroidRuntime(27504): FATAL EXCEPTION: Thread-9043
02-11 15:18:31.329: E/AndroidRuntime(27504): java.lang.NullPointerException
02-11 15:18:31.329: E/AndroidRuntime(27504):    at com.example.testwiththread.MainActivity$TestThread.run(MainActivity.java:67)
02-11 15:18:31.329: E/AndroidRuntime(27504):    at java.lang.Thread.run(Thread.java:856)

However, the only one that doesn't return this error is when I use my router's IP address. The problem is, even though the connection is not refused, it says that access is forbidden. Any help will be appreciated.

EDIT: Just in case, I have given internet access in the Manifest.

You can't use http://10.0.2.2:8080/webservice.php if your WAMP server isn't located at 10.0.2.2 . This address is usede within an emulator running on the same host as your webserver , meaning if you're testing on a tablet and not the Android emulator program it wont work for you. To resolve this update your address to either:

(A) The public IP of your router with appropriate port forwarding done to route port 8080 to the WAMP host.
(B) The IP address local to your wifi network. Under typical setups this is 192.168.1.x but we can't guarantee that. Note that this will allow your connection to work only when you are on your home wifi.

You can locate your public IP by googling "what is my IP". You can locate your local IP by opening Start->Run->cmd and typing ipconfig . The address listed beside "IPv4 Address" should provide you the details.

I managed to solve the problem changing a setting in the Apache httpd.conf.

#   onlineoffline tag - don't remove
    Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1

I changed it to

#   onlineoffline tag - don't remove
    Order Deny,Allow
    Allow from all
    Allow from 127.0.0.1

And now my tablet can access the web service. I am unaware if there is a better way to do this. Of course, I should mention that I am not using the 10.0.2.2 IP but rather the router's IP address. I also changed the Listen in the httpd.conf to 8080. So far it is working.

I am using PHP for webservice and Android 4.x. device for connecting to the webservice. I had similar problem where, using 10.0.2.2 worked well with emulator but failed to connect from device. The solution that worked for me is: Find IP of your computer ... say 192.168.0.103 Find the port of your apache ... say 8080 Now open httpd.conf and locate following line Listen 127.0.0.1:8080 After this line add following Listen 192.168.0.103:8080 Thats it. Now if you 192.168.0.103:8080 in your android code, it will connect!!

It sounds like it isn't the code, but the configuration, or lack of the right address. 127.xxx always refers to the computer you're on. 10.0.2.2 is a non-routable address so it must be on the network you are using.

You mention that your computer is the one you're working on and connected to the router. The tablet is connected via wifi. Is the tablet connected to the same router? From the computer you're working on, can you go to http://10.0.2.2:8080/... and access the page?

In another response (I can't comment on responses though) you say that you've tried using the address of the router. I assume that's for port forwarding reasons. Many routers do not allow port forwarding from internal they are WAN to LAN port forwarding, not LAN to LAN, so that's not too surprising if you're internal and the computer hosting the page is also internal.

That being said, can you access the page from the computer you're on. Can you check the IP for the computer you're on (start->cmd->ipconfig and look for 10.0.xx or 192.168.xx ). Using that address hopefully will work for you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM