热门标签:
Q:

SOCKETEXCEPTION:OS错误:连接拒绝,errno=111在flutter使用django后端

我正在用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:OS错误:连接拒绝,errno=111

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

原网址
A:

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

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

可能的解决方案:

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

期货注意事项

我在上面注意到代码正在使用await,然后在同一行上。 这可能会令人困惑,要清楚的是,await用于暂停执行,直到future完成,而then是在future完成后执行的回调函数。 同样可以写如下

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

或者非async/await方法

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

所有回答

共 20 条

author avatar

我去了终端并使用ifconfig命令

我得到了我的IP地址:192.168.0.109

在这里输入图像描述

author avatar

除了Rohan的答案你还可以阅读:

无法使用Flutter调用Localhost,随机端口被分配给HTTP GET调用

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

adb reverse tcp:3001 tcp:3001

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

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

author avatar
  • 如果在本地主机而不是本地主机使用网络的IP
  • 提示:在cmd中查找Ip运行ipconfig并获取ipv4

1:例子:

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

如果在服务器中写入主的url

author avatar

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

author avatar

我在真实设备中运行遇到了同样的问题,并且只更改API链接中的IP不起作用。

我的解决方案是使用下面的命令运行服务器:

manage.py runserver 0.0.0.0:8000

然后将您的机器IP传递给API链接而不是localhost,如下面的示例所示:

http://192.168.0.67:8000
author avatar

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

解决方案是。

  1. 连接您的工作区(计算机,仿真器,设备)在同一 网络。
  2. 通过在终端上键入ifconfig找到您的IP。
  3. 如果您使用Laravel构建API,请启动指定到计算机IP ADDRESS的服务器sudophp 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. 如果一切正常,您可以使用应用程序运行。 去吧!!!
author avatar

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

author avatar

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

author avatar

这是我不得不改变的,以修复我的情况下的相同错误:

  • python manage.py runserver 0:8000而不仅仅是python manage.py runserver(0:8000是0.0.0.0:8000的缩写,使您的web应用程序在本地网络上可见-请参阅https://docs.djangoproject.com/en/3.0/ref/django-admin/#runserver)
  • 在您的flutter应用程序中,使用您的pc本地ip指定服务器地址,即,而不是http://localhost:8000 使用类似的东西http://192.168.1.2:8000。 若要检索当前ip地址,请在终端中运行ipconfig(如果在Windows上),否则运行ifconfig
  • 必要时在django设置中更新允许的主机。 例如setALLOWED_HOSTS = ['*', ](但仅在您的dev环境中!)
author avatar

在C#[.net core api]中,转到launchSettings。在属性选项卡下的json并将follwing代码更改为此(在applicationURl上将localhost更改为0.0.0.0),在应用程序(flutter)上,使用本地IPV4IP。 ex:(192.169.0.10)

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

在我的机器上工作的soltion

[√] Flutter (Channel stable, 2.5.3, on Microsoft Windows [Version 10.0.19043.1288], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
[√] Chrome - develop for the web
[√] Android Studio (version 2020.3)
[√] VS Code (version 1.61.2)
[√] Connected device (3 available)

步骤:1(获取您的ipv4)

在终端/cmd类型

  • ifconfig适用于Mac/Linux/Unix
  • ipconfig适用于Windows

你会在windows中得到一些结果,它看起来像在这里输入图像描述

适用于iOS

ios/Runner/Info.plist中加上这个

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsLocalNetworking</key>
    <true/>
</dict>

author avatar

我用$ adb tcpip <port-your-local-server>解决了这个问题

author avatar

我在flutter with spring backend中遇到了同样的问题。 而不是使用 'http://localhost:8080/'在我的请求中,我将其更改为'http://143.235.7.641:8080/'其中'143.235.7.641'是我的Wi-Fi IPv4地址,它工作。

(注意:我假设您正在物理电话中测试flutter,并且电话和计算机连接相同的wi-fi。)

author avatar

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

author avatar
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。

author avatar

尝试ths链接延迟功能,你不会得到这个错误

Future.delayed(const Duration(milliseconds: 500), () {
    widget.callback();
  });

它为我工作

author avatar

对于mac用户检查ip地址

在终端类型:ipconfig getifaddr en0并使用该Ip地址如下

import 'dart:io';

import 'package:http/http.dart' as http;
import 'package:fluttertoast/fluttertoast.dart';

class AuthAction {
  static String BASE_URL = 'http://192.168.0.105:27017/';

  static Future<Null> signUpAction(
      firstName, lastName, email, password, userName) async {
    try {
      http.Response res = await http.post( Uri.parse(BASE_URL + 'signUp' ));
      print(res);

      if (res.statusCode == 200) {
      }
    } catch (err) {
      print(err);

        // Fluttertoast.showToast(msg: 'err');
    }
  }
}

注意:我没有触摸我的mongo-node服务器正在运行的端口。 也就是27017

author avatar

如果您在real phone上运行,那么即使将localhost地址添加到允许的主机,您也会收到此错误。 对我来说,将我的笔记本电脑连接到手机的热点,并使用笔记本电脑的ipv4地址(您可以使用ipconfig命令找到)通过python运行django服务器manage.py runserver192.168.。:8000即您的ipv4地址:端口号,比您将能够使用手机的浏览器访问django服务器以及,现在将此您的ipv4地址添加到您允许的主机。 并且,将您的url从localhost或127.0.0.1更改为您的ipv4地址。 我希望这能解决你的问题。

author avatar

将您的URL替换为:

Uri.parse("YourURL").replace(host: "YourIPAddress");

解释:这个错误意味着你的主机地址不正确(正如上面的答案已经指出的那样)。 因为你可能有一个物理设备,它必须访问你连接到你的计算机(又名你的IP地址)的模拟器服务器。

如何获取我的IP地址?

MAC:ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}'

WINDOWS:netsh interface ip show address | findstr "IP Address"

author avatar

我知道这个问题太老了,但我会回答这个,因为这可能对有这个问题的人有帮助。

没有更多细节,我无法给出具体的解决方案。 但具有以下条件可以给出一个具体的解决方案

  • 我想象API主机在本地计算机中
  • 我想象你使用你的模拟器来运行应用程序

您与postman尝试的URL可能是这样的http://127.0.0.1:[port number]/registerhttp://localhost:[port number]/register。 但这可能不适用于模拟器,因为它无法访问该URL。 要访问您的本地主机,您需要找出主机地址。

按照以下步骤获取您的主机地址。

  • 点击android模拟器中的三个点(更多)
  • 设置->代理
  • 如果您愿意,可以通过选择"手动代理配置"来更改主机地址

然后你可以看到你的host nameport number。 然后用像http://10.0.0.2:5000/register这样的URL替换你的URL。

<img alt="在这里输入图像描述"src="https://i.stack.imgur.com/shnp1.png缧/>

相似问题