java Android Web 服务连接被拒绝

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14819481/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 17:29:27  来源:igfitidea点击:

Android Web Service connection refused

javaphpandroidweb-serviceshttpwebrequest

提问by plasmy

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:

我知道我的代码是正确的,因为它运行了一次。我的 PHP 没有问题,因为当它运行时,它返回我想要的。这里的问题在于请求。我正在尝试获取正确的地址,但到目前为止,我已经尝试了所有可能的地址,但都没有成功。我的代码是:

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:

我的 JSON 解析器:

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

如您所见,我使用 10.0.2.2:8080 作为本地主机地址。我已经尝试了 127.0.0.1、localhost 和许多其他包含在 localhost 的 Android 页面中的选项。他们中的大多数返回此错误

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.

但是,唯一不返回此错误的是当我使用路由器的 IP 地址时。问题是,即使没有拒绝连接,它也表示禁止访问。任何帮助将不胜感激。

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

编辑:以防万一,我在清单中提供了互联网访问权限。

回答by Grambot

You can't use http://10.0.2.2:8080/webservice.phpif 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:

你不能使用http://10.0.2.2:8080/webservice.php,如果你的WAMP的服务器不位于10.0.2.2。此地址在与您的 webserver 运行在同一主机上的模拟器中使用,这意味着如果您在平板电脑上而不是 Android 模拟器程序上进行测试,则它对您不起作用。要解决此问题,请将您的地址更新为:

(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 onlywhen you are on your home wifi.

(A)路由器的公共 IP,并进行了适当的端口转发以将端口 8080 路由到 WAMP 主机。
(B)您的 wifi 网络的本地 IP 地址。在典型设置下,这是 192.168.1.x,但我们不能保证。请注意,这将使您的连接在您使用家庭 wifi 时才能工作。

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

您可以通过谷歌搜索“我的 IP 是什么”来定位您的公共 IP。您可以通过打开Start->Run->cmd并键入来定位您的本地 IP ipconfig。“IPv4 地址”旁边列出的地址应为您提供详细信息。

回答by plasmy

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

我设法解决了更改 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.

现在我的平板电脑可以访问网络服务。我不知道是否有更好的方法来做到这一点。当然,我应该提到我使用的不是 10.0.2.2 IP,而是路由器的 IP 地址。我还将 httpd.conf 中的 Listen 更改为 8080。到目前为止它正在工作。

回答by Sandeep Chavarkar

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!!

我将 PHP 用于 webservice 和 Android 4.x。用于连接到网络服务的设备。我有类似的问题,使用 10.0.2.2 在模拟器上运行良好,但无法从设备连接。对我有用的解决方案是:查找您计算机的 IP ... 说 192.168.0.103 查找您的 apache 的端口 ... 说 8080 现在打开 httpd.conf 并找到以下行 Listen 127.0.0.1:8080 在此行之后添加以下听 192.168.0.103:8080 就是这样。现在,如果您在 android 代码中输入 192.168.0.103:8080,它将连接!!

回答by Dave

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

听起来不是代码,而是配置,或者缺少正确的地址。127.x.x.x总是指您使用的计算机。 10.0.2.2是不可路由的地址,因此它必须位于您正在使用的网络上。

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?

您提到您的计算机是您正在使用并连接到路由器的计算机。平板电脑通过wifi连接。平板电脑是否连接到同一路由器?从您正在使用的计算机上,您可以转到http://10.0.2.2:8080/...并访问该页面吗?

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.

在另一个回复中(虽然我无法评论回复),您说您已经尝试使用路由器的地址。我认为这是出于端口转发的原因。许多路由器不允许从内部进行端口转发,它们是 WAN 到 LAN 端口转发,而不是 LAN 到 LAN,因此,如果您是内部的并且托管页面的计算机也是内部的,那就不足为奇了。

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.x.xor 192.168.x.x). Using that address hopefully will work for you.

话虽如此,您能否从您所在的计算机访问该页面。您能否检查您所在计算机的 IP(开始->cmd->ipconfig 并查找10.0.x.x192.168.x.x)。希望使用该地址对您有用。