【问题标题】:Dart/Flutter sockets connects on random portDart/Flutter 套接字连接到随机端口
【发布时间】:2022-01-13 18:57:15
【问题描述】:

现代编程变得越来越令人沮丧。尝试在 Flutter 上做一个简单的套接字测试应用程序(在 Android 上测试)。代码简单明了:

 void Connect()
  {
    print("connecting...");
    Socket.connect("localhost", 80).then((Socket sock) {
      socket = sock;
      socket?.listen(dataHandler,
          onError: errorHandler,
          onDone: doneHandler,
          cancelOnError: false);
      socket?.write("GET / HTTP/1.1");
    }).catchError((Object e) {
      print("Unable to connect: $e");
    });
  }

代码抛出异常。输出:

I/flutter (15930): connecting...
I/flutter (15930): Unable to connect: SocketException: OS Error: Connection refused, errno = 111, address = localhost, port = 47244

端口总是不同的,为什么会出现TF?

【问题讨论】:

  • 您希望在 Android 设备的“localhost”的端口 80 上运行什么?您不想指定您希望 Android 设备上的应用程序连接到的服务器的 IP 地址吗?
  • 另一个问题是您为什么要尝试使用Socket 进行HTTP 通信? dart:io 中有HttpClient,你可以在 pub.dev 上找到多个包,这使得 HTTP/HTTPS 通信更容易。

标签: android flutter sockets dart


【解决方案1】:

错误消息中的端口号是本地端口,而不是远程端口。这里有一个关于这个问题的问题:https://github.com/dart-lang/sdk/issues/12693

简而言之,使用 TCP 连接时,需要两个端口。一个在您的设备上打开的本地端口和一个在您尝试调用的系统上打开的端口的远程端口。建立连接后,这两个端口号之间进行通信。

因此,错误表明您在localhost:80 上运行的服务器拒绝来自您的应用程序的连接。错误消息中的本地端口号通常可以忽略,因为它与调试大多数问题并不真正相关。

【讨论】:

  • 明白。之前从未见过错误消息指出本地端口,而不是您尝试连接的端口。谢谢!
  • @Nanev 是的,我被同样的细节烧伤了,这就是为什么我知道报告的问题。 :)
猜你喜欢
  • 2020-10-07
  • 2012-02-09
  • 2019-12-25
  • 1970-01-01
  • 2010-12-30
  • 2014-01-14
  • 2013-08-20
  • 2020-04-07
  • 2022-01-09
相关资源
最近更新 更多