SocketException:操作系统错误:使用django后端,连接被拒绝,errno = 111。

时间:2019-04-21 18:31:31

标签: django flutter django-rest-framework pythonanywhere

我正在用Django rest-framework开发一个Flutter应用程序。注册api在Postman中运行良好,但是从flutter应用程序成功注册后,它会显示上述错误。该请求已通过https地址发送。

删除了csrf。什么都没发生。

请求:

var data = {'email':signupemailidcontroller.text,
            'password1':passwordcontroller.text,
            'password2':confirmpasswordcontroller.text,
           };
        //http request here
        await http.post(websitesignupurl,
                        headers: headers,
                        body: json.encode(data))
          .then((onResponse){
            print(onResponse.body);
          }).catchError((onerror){
            print(onerror.toString());
        });

控制台中的输出:

SocketException:操作系统错误:连接被拒绝,errno = 111

我希望此请求的响应是一个包含用户和令牌的Json对象。

15 个答案:

答案 0 :(得分:6)

除了Rohan的回答,您还可以阅读:

Unable to make calls to Localhost using Flutter, random port being assigned to HTTP GET call

我试图使用本地服务器在物理设备上运行我的应用程序,因此,我不得不使用以下提到的命令,请记住根据您自己的端口号更改端口号

adb reverse tcp:3001 tcp:3001

@maheshmnj指出此命令正在重定向您手机的 端口3001到计算机的端口3001。如果要 将手机的端口2000重定向到计算机的端口3000,然后 您可以这样做adb reverse tcp:2000 tcp:3000

您还可以通过下面提到的页面阅读有关adb和网络的信息 https://developer.android.com/studio/command-line/adb.html

答案 1 :(得分:4)

  • 如果在localhost而不是localhost,则使用您网络的IP
  • 提示:要在cmd中找到运行Ip的ipconfig并获取ipv4

1:示例:

await http.post("http://127.68.34.23/wp-json/...",
                    headers: headers,
                    body: json.encode(data))

如果在服务器中,则将main的URL写入url

答案 2 :(得分:4)

我去了终端,并使用了ifconfig命令

我有我的IP地址:192.168.0.109

enter image description here

然后,在Flutter应用程序HTTP请求中,我只是用我的“ localhost”替换了该IP地址。而且它就像一种魅力!

答案 3 :(得分:3)

如果您在 url 中使用“localhost”,请将其更改为您的 ipv4 地址,它会起作用

答案 4 :(得分:1)

我在春季后端的抖动中也遇到了同样的问题。而不是使用 在我的请求中将“ http:// localhost:8080 /”更改为“ http://143.235.7.641:8080/”,其中“ 143.235.7.641”是我的Wi-Fi IPv4地址,并且可以正常工作。

(注意:我假设您正在物理电话中测试抖动,并且电话和计算机连接到同一Wi-Fi。)

答案 5 :(得分:0)

Harnish,需要更多一些细节才能调试此错误。

  1. 您是在本地运行服务器还是与远程服务器通信?
  2. 您是否正在Android模拟器上运行该应用?

可能的解决方案:

如果您在本地运行服务器并使用Android模拟器,则服务器端点应为10.0.2.2:8000而不是localhost:8000,因为AVD使用10.0.2.2作为主机环回的别名界面(即localhost

关于期货的注意事项

我在上面注意到代码正在使用await,然后在同一行上。显然,这可能会造成混淆,await用于暂停执行直到将来完成,而then是在将来完成之后执行的回调函数。可以这样写:

void myFunction() async {
    var data = {};
    var response = await http.post(URL, headers:headers, body:data);
    if (response.statusCode == 200) {
        print(reponse.body);
    } else {
       print('A network error occurred');
    }
}

或非异步/等待方法

void myFunction() {
    var data = {};
    http.post(URL, headers:headers, body:data)
    .then((response) => print(response.body))
    .catchError((error) => print(error));
}

有关Dart期货的更多详细信息,请阅读 https://www.dartlang.org/tutorials/language/futures

答案 6 :(得分:0)

尝试将<uses-permission android:name="android.permission.INTERNET"/>添加到清单中。这为我解决了这个问题。

答案 7 :(得分:0)

我用$ adb tcpip <port-your-local-server>

解决了这个问题

答案 8 :(得分:0)

这是我为解决同一错误而必须更改的内容:

  • 使用python manage.py runserver 0:8000而不是python manage.py runserver来启动django(0:8000是0.0.0.0:8000的缩写,并使您的Web应用程序在本地网络上可见-请参见https://docs.djangoproject.com/en/3.0/ref/django-admin/#runserver
  • 在flutter应用中,使用您的PC本地IP指定服务器地址,即使用http://192.168.1.2:8000之类的地址代替http:// localhost:8000。要检索您当前的IP地址,请在终端上运行ipconfig(如果在Windows上),否则请运行ifconfig
  • 如有必要,在Django设置中更新允许的主机。例如,设置ALLOWED_HOSTS = ['*', ](但只能在您的开发环境中!)

答案 9 :(得分:0)

您需要做的是获取您的公共PC IP并在您的URL中使用它,例如: http://192.168.0.67:3000,其中3000是端口号。

答案 10 :(得分:0)

我曾经有过同样的问题, 经过一些过于复杂的stackoverflow答案和Google搜索之后,我终于弄清楚了, 在这种情况下,您最有可能使用的是Android模拟器,因此只需打开模拟器上的移动数据,然后再试一次,我确定这次可以使用。

答案 11 :(得分:0)

在真实设备上运行时,我遇到了同样的问题,仅更改API链接中的IP无效。

对我来说,解决方案是使服务器运行以下命令:

manage.py runserver 0.0.0.0:8000

然后将您的计算机IP传递到API链接而不是localhost,如下所示:

http://192.168.0.67:8000

答案 12 :(得分:0)

在C#[。net核心api]中,转到“属性”选项卡下的launchSettings.json并将以下代码更改为此(将localhost在applicationURl上更改为0.0.0.0)和在应用程序(flutter)上,使用您的本地IPV4 IP 。例如:(192.169.0.10)

"coreWebAPI": {
      "commandName": "Project",
      "launchBrowser": false,
      "launchUrl": "api/values",
      "applicationUrl": "http://0.0.0.0:5000", 
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }

答案 13 :(得分:0)

final response = await client.post(
    "http://192.xxx.xx.xx/api/signin", 
    headers: {"Authorization": apiKey},
    body: jsonEncode({
      "username": username,
      "password": password,
    }));

即使我遇到了 SocketException 错误,但我替换了我的 IP 地址并且没有提到任何端口号,它对我有用,如果我提到端口号,它会抛出错误。 希望这会奏效。

我使用 Flask 作为后端,使用 blocs。

答案 14 :(得分:0)

当端点不正确或您的主机和服务器后端(示例 Laravel API)不共享相同的 IP 地址时,会出现此问题。

解决方案是。

  1. 将您的工作区(计算机、模拟器、设备)连接到同一个 网络。
  2. 通过在终端 ifconfig 上输入来查找您的 IP。
  3. 如果您使用 Laravel 构建 API,请启动指定您计算机 IP ADDRESS 的服务器,sudo php artisan serve --host YOUR_COMPUTER_IP_ADDRESS --port NUMBER

示例:

`sudo php artisan serve --host 192.168.1.11 --port 80`
  1. 在 Postman 或类似应用程序中测试您的端点并输入 http://192.168.1.11:80/Your_Route
  2. 如果一切正常,您可以使用 app 运行。去!!!