安卓:Volley无法连接错误

7

我正在尝试通过Android连接到使用Spark创建的REST服务器。 我可以使用POSTMAN(Chrome插件)发送POST请求并获得所需结果, 但是当我从我的Android设备发送POST请求时,出现以下错误:

E/error: com.android.volley.NoConnectionError: java.net.ConnectException: failed to connect to /127.0.0.1 (port 4567) after 2500ms: isConnected failed: ECONNREFUSED (Connection refused)

这是服务器部分:
Spark.post("/up", new Route()
    {
        public Object handle(Request req, Response res)
        {
            System.out.println(req.queryParams());
            return "its something";
        }
    });

这是关于 Android 的部分:

public void sendHTTPRequest()
{
    RequestQueue MyRequestQueue = Volley.newRequestQueue(this);

    String url = "http://127.0.0.1:4567/up";
    StringRequest MyStringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            //This code is executed if the server responds, whether or not the response contains data.
            //The String 'response' contains the server's response.
        }
    }, new Response.ErrorListener() { //Create an error listener to handle errors appropriately.
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("error",error.toString());
        }
    }) {
        protected Map<String, String> getParams() {
            Map<String, String> MyData = new HashMap<String, String>();
            MyData.put("Field", "Value"); //Add the data you'd like to send to the server.
            return MyData;
        }
    };
    MyRequestQueue.add(MyStringRequest);
}

我还在清单文件中添加了重要的权限。

我搜索了几个小时,但是仍然无法解决我的问题:( 希望你能帮助我。 最好的祝福, Felix

6个回答

15
TLDR; 使用服务器的无线电或以太网IP地址,而不是127.0.0.1。 127.0.0.1 是Android设备上的回环IP地址。你需要计算机网络适配器的IP地址。我假设你正在模拟器或某种Android设备上运行。如果你的服务器在本地Wifi网络上运行,请获取你的 Wifi 适配器Ethernet 适配器 的IP地址,然后用所述地址替换 127.0.0.1
Linux: ifconfig [wlan0] Windows: ipconfig 编辑 2020:
更新版本的Android要求所有HTTP流量必须加密,否则Android框架将抛出错误。因此,在本地服务器测试时,建议使用像Ngrok这样带有免费SSL的隧道服务器。

哎呀,出错了:无法连接到主机。即使使用curl我也无法连接到服务器。 - Cyberlander
尝试通过机器的 "localhost" 连接到该机器上的服务器。 - Peter Chaula
2
是的,那很有效(正如我所写的,Postman 起作用了),但当我尝试从我的 Android 设备向特定 URL(192.168.0.81:4567)发送 POST 请求时,我没有收到响应。也许是防火墙问题?我用 netstat 检查了端口,但我的机器似乎在 4567 端口上监听。 - Cyberlander
哦,谢谢。这一定是我今年最尴尬的时刻了。127.0.0.1是模拟设备的环回地址。 - user140327

3
Give Internet Permission:

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

Add this line in your manifest:

android:usesCleartextTraffic="true"

because I faced the same issue with my project.

It should look like this:

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

这帮了我很多,谢谢。 - Derrick Wright
这个简单的技巧帮助了我。我能够连接到Digital Ocean而不是Lightsail。现在可以用了! - Wayne Tun

1
如果您在本地进行测试,请尝试检查一个IP地址(在窗口中打开cmd运行ipconfig),然后再次放置您的IP地址。

以下是一个示例:

String url = http://127.0.0.1:8080/user <-- 出错了

String url = "http://172.16.5.240:8080/user <-- 成功了



0

检查您的XAMPP或WAMP连接。如果MySQL和Apache服务未激活,请启动所有服务并运行应用程序,它将给出正确的输出。


-1

将http更改为https,这个解决了我的问题 或在清单中添加android:usesCleartextTraffic="true"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接